2013-06-14 3 views
-4

У меня есть столы; Категория, Предмет и класс.Связь с несколькими таблицами

Category -> id, name, desc; 
Subject -> id, name, desc, category_id; 
Grade -> id, name, desc, subject_id. 

И у меня есть другой стол, Цена. В настоящее время

Price -> id, amount, category_id. 

Да, цены были добавлены к категориям, но новое требование, цена может быть добавлена ​​к любому уровню, то есть категории, Тема или Grade.

Я знаю способ решить эту проблему, добавив остальные внешние ключи в таблицу цен, as -> id, amount, category_id, subject_id, grade_id. Затем оставьте их NULL, чем соответствующая таблица.

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

Я использую MySQL и PHP.

+0

Возможный дубликат [Возможно использовать внешний ключ MySQL для одной из двух возможных таблиц?] (Http://stackoverflow.com/questions/441001/possible-to-do-a-mysql-foreign-key-to -один-двух-возможных таблиц) –

ответ

2

Решение 1: Добавить цены числового поля для каждой таблицы

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

Решение 2: Создать три отношения таблицы цен

Вы можете создать три таблицы которых являются:

CategoryPrice -> Category_ID, Price 
SubjectPrice -> Subject_ID, Price 
GradePrice -> Grade_ID, Price 

Для строк в ваших три исходных таблицах, которые не имеют цены вы опускаете запись в таблицах отношений цены.

Решение 3: Создание типа Supertype присоединиться с Цены Таблица

Вы можете создать таблицу Supertype под названием «Объект», который будет иметь уникальный идентификатор. Все категории, предметы и классы будут иметь подтипы объекта и, следовательно, иметь один и тот же идентификатор.

Следовательно, вы можете использовать Object_ID в таблице «Цены», чтобы назначать цены объектам.

+0

Решение 1 не применимо, так как цены могут быть изменены с помощью условий. Я избегал Term ID в таблице цен. – Sureshkumar

+0

Очень хорошая идея -> Решение 3. Спасибо. – Sureshkumar

Смежные вопросы