2012-04-21 2 views
0

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

Предположим, что у меня есть таблицы (сущности) в базе данных моего сайта: пусть это будут «Обувь», «Шляпы» и «Коньки». Я не хочу создавать отдельные таблицы комментариев для каждой сущности (например, «shoes_comments», «hats_comments», «skates_comments»). Моя идея - как-то хранить все комментарии в одной большой таблице.

Один из способов сделать это, что я думал, это создать таблицу:

table (comments): 
ID (int, Primary Key), 
comment (text), 
Product_id (int), 
isSkates (boolean), 
isShoes (boolean), 
isHats (boolean) 

и как флаг для каждого объекта, который может иметь комментарии.

Затем, когда я хочу, чтобы получить комментарии для некоторого продукта ВЫБОР запрос будет выглядеть так:

SELECT comment 
FROM comments, ___SOMETABLE___ 
WHERE ____SOMEFLAG____ = TRUE 
    AND ___SOMETABLE___.ID = comments.Product_id 

Это эффективный способ для реализации базы данных для необходимой функциональности? Какие еще способы я могу сделать это?>

ответ

1

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

+0

Моя идея несколько отличается. Поскольку я понял вашу идею: добавьте внешний ключ в глобальную таблицу комментариев для каждой таблицы Entity. –

1

Извините, это кажется странным.

У вас действительно есть отдельная таблица для каждого типа продукта? Не имеют ли они общих полей (например, имя, описание, цена, изображение продукта и т. Д.)?

Моя рекомендация, как для таблиц: product для общих полей, comments с внешним ключом к product но без hasX колонн, hat только с полями, которые являются специфическими для линии шляпы продукта. Первичным ключом в hat является либо product ПК, либо индивидуальное уникальное значение (тогда вам понадобится дополнительное поле для внешнего ключа до product).

+0

Хорошо, я думаю, для продуктов для одного типа это не сложно. Но в моей ситуации у меня есть сущности совершенно разных вещей (предположим: Организация, Персонал, Техническое оборудование), и мне нужно хранить комментарии для них ... –

+0

Хорошо, я был обманут вашими примерами, извините. Тем не менее, вам нужна только одна таблица 'comment', если вы хотите немного согнуть правила. Вы не хотите иметь столбец внешнего ключа в 'comment' для каждого объекта, у которого есть комментарии, которые я предполагаю. Что делать, если у вас нет фактического столбца внешнего ключа, но один столбец, объявленный как 'parent_id' в' comment'? Я полагаю, что отношение от 'X' до' comment' может быть однонаправленным? Один из альтернатив должен состоять в том, чтобы иметь таблицу объединений для каждого 'X' для' comment', например 'shoe_x_comment',' hat_x_comment'. –

0

«нормированный» способ сделать это, чтобы добавить еще один объект (скажем, «Продукт»), который объединяет все характеристики, общие для обуви, головных уборов и скатов (включая комментарии)

   +-- 0..1 [Shoe] 
       | 
[Product] 1 --+-- 0..1 [Hat] 
    1   | 
    |   +-- 0..1 [Skate] 
    * 
[Comment] 

Помимо соображений производительности , недостатком здесь является то, что в модели данных нет ничего, что препятствовало тому, чтобы строка в Product указывала как строка в Shoe, так и одна в Hat.

Есть и другие альтернативы (каждый из них с перками & недостатки) - вы можете прочитать что-то о «стратегиях наследования jpa» - вы найдете статьи, посвященные Java, которые обсуждают вашу проблему (просто игнорируйте java babbling и прочитайте остальное)

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

+0

В ситуации, когда я создам таблицу «КОММЕНТАРИЙ» и из таблиц сущностей (шляпа, обувь, коньки) соедините их с ней соотношением 1: 1, будет ли это работать? –

+0

Да, это идея! Прежде чем идти на это, вы захотите рассмотреть выступления ... например: для добавления нового ботинка вам понадобятся два вставных оператора (1 для комментариев и 1 для обуви) - если у вас есть идентификатор комментария, и вы хотите перейдите к его владельцу, вам понадобятся (возможно, несколько) предложений о союзе, так как вы не знаете заранее, в какой таблице находится объект (может быть Shoe, Hat или Skate) ... – giorgiga

+0

Проблема здесь в том, что E/R не наследует - можно имитировать его (как в трех стратегиях JPA), но он должен принять некоторые компромиссы – giorgiga

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