Запрос таблицы объединения с полями в виде столбцов - PullRequest
2 голосов
/ 20 августа 2008

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

У меня есть три основных таблицы: 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

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

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

Ответы [ 5 ]

1 голос
/ 20 августа 2008

Связанные, но значения - это значения, которые хранятся в отдельных столбцах, и вы уже давно знаете свои «особые типы»:
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
0 голосов
/ 20 августа 2008

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

0 голосов
/ 20 августа 2008

Один из вариантов заключается в том, чтобы свойства имели 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 августа 2008

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

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

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

...