Запрос таблицы объединения с полями в виде столбцов

Я не совсем уверен, возможно ли это, или подпадает под категорию сводных таблиц, но я решил, что пойду к профессионалам, чтобы посмотреть.

У меня есть три основных таблицы: Card, Property и CardProperty. Поскольку карточки не имеют одинаковых свойств и часто имеют несколько значений для одного и того же свойства, я решил использовать подход таблицы объединения для хранения данных вместо того, чтобы иметь действительно большую структуру столбцов в моей карточной таблице.

Таблица свойств является базовой таблицей ключевых слов / типов значений. Итак, у вас есть ключевое слово ATK и присвоенное ему значение. Есть еще одно свойство SpecialType, для которого карта может иметь несколько значений, например «Sycnro» и «DARK»

Я хотел бы создать представление или хранимую процедуру, которая дает мне идентификатор карты, имя карты и все ключевые слова свойств, назначенные карте в виде столбцов, и их значения в ResultSet для указанной карты. Так что в идеале у меня был бы такой набор результатов:

ID  NAME                   SPECIALTYPE
1   Red Dragon Archfiend   Synchro
1   Red Dragon Archfiend   DARK
1   Red Dragon Archfiend   Effect

и я мог бы подсчитать свои результаты таким образом.

Я полагаю, что даже проще было бы просто объединить свойства вместе на основе их ключевого слова, чтобы я мог сгенерировать ResultSet, например:

1  Red Dragon Archfiend   Synchro/DARK/Effect

..но я не знаю, возможно ли это

Помоги мне переполниться стеком Kenobi! Ты моя единственная надежда.

20.08.2008 15:23:02
5 ОТВЕТОВ

Не сворачивайте путем объединения для хранения связанных записей в вашей базе данных. Это не совсем лучшие практики.

То, что вы описываете, это сводная таблица. Сводные таблицы жесткие . Я бы посоветовал избегать их, если это вообще возможно.

Почему бы просто не прочитать связанные строки и обработать их в памяти? Не похоже, что вы потратите на это слишком много миллисекунд ...

0
20.08.2008 15:34:04

Один из вариантов заключается в том, чтобы свойства имели PropertyType, поэтому:

table cards
integer ID | string name | ... (other properties common to all Cards)

table property_types
integer ID | string name | string format | ... (possibly validations)

table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID

table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID

Таким образом, когда вы хотите установить новое значение свойства, вы можете проверить его по типу. Один тип может быть «SpecialType» с перечислением значений.

0
20.08.2008 15:39:05

Связанные, но значения - это значения, хранящиеся в отдельных столбцах, и вы уже давно знаете свои «особые типы»:
SQL-запрос для сравнения продаж продукта по месяцам

В противном случае я бы сделал это с помощью курсора в хранимой процедуре или предварительно преобразовал бы преобразование в бизнес-уровень или уровень представления.

Ударьте в sql, если вы знаете все случаи:

Select
    ID,NAME
    ,Synchro+DARK+Effect --  add a some substring logic to trim any trailing /'s
from
    (select
        ID
        ,NAME
        --may need to replace max() with min().
        ,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
        ,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
        ,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
    from
        table
    group by
       ID
       ,NAME) sub1
1
23.05.2017 10:27:42

У меня есть тип / формат для моей таблицы свойств, так что я знаю, как привести / оценить, когда я имею дело с целочисленным значением. Я не был уверен, имеет ли это отношение к этому вопросу или нет.

0
20.08.2008 17:29:19