2010-09-20 3 views
2

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

спасибо.

ответ

2

Вы могли бы products_attributes таблицу, где талии может быть 5 и размер может быть 8 (в зависимости от того, как он установлен). Это также позволяет вам легко добавлять новые атрибуты в будущем (или даже иметь возможность для конечного пользователя добавлять новые атрибуты).

Тогда вы могли бы иметь столбцы как

| attribute_id | value | product_id | 
===================================== 
| 5   | "30cm"| 28   | 
===================================== 
+0

Ударьте меня на 1 сек! Черт быстро читайте! :) – PostMan

+0

@PostMan Ха-ха, это случается со мной все время! – alex

+0

Но тогда все значения будут сохранены в строке. Разве вы не думаете, что это не эффективно с точки зрения поиска и сортировки? – Dreteh

1

Вы можете добавить атрибут продукта таблицу, в которой будет один продукт многих атрибутов.

Каждый атрибут будет иметь тип и значение, это будет решать ваши проблемы :)

+0

см. Мой комментарий ниже к ответу @ alex. он будет работать, но будет работать только в том случае, если все атрибуты имеют одинаковый тип данных. – RPM1984

2

Я бы со следующим:

Продукт

ProductID INT IDENTITY, 
Cost DECIMAL(4,2), 
Price DECIMAL(4,2), 
Quantity INT 

Жан

ProductID INT, 
Waist INT 

Рубашка

ProductID INT, 
Size INT 

Вы можете сделать ProductID на Жан/рубашки таблиц внешний ключ к колонке ProductID о продукте.

Таким образом, вы являетесь , распространяя основные атрибуты продукта для более конкретных продуктов.

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

В настоящее время мы реализуем аналогичную структуру, так что наше приложение ORM может поддерживать «наследование» для объектов.

Чтобы получить Jeans, ваш запрос будет:

SELECT Product.ProductID, Product.Cost, Product.Price, Product.Quantity, Jean.Waist 
FROM Product Product 
INNER JOIN Jean Jean 
ON Product.ProductID = Jean.ProductID 

Конечно, если вы ищете простую замену, приведенные ниже ответы будут в порядке.

Но это «будущая защита» вашей базы данных для будущего.

HTH

+0

Вот что я имею в виду. Просто хочу убедиться, что это лучшее решение. Спасибо. – Dreteh

+0

Это стандартный ответ для «реляционного моделирования специализации обобщения». Мне это хорошо. –

3

Существует несколько способов приблизиться к этому.

Вы описали один, single-table inheritence (где у вас есть пустая строка с нулевыми столбцами для нерелевантных атрибутов).

Ответ RPM1984 предлагает class-table inhertience, где общие данные поступают в основную таблицу, и каждый «тип» получает свою собственную таблицу для дополнительных атрибутов.

Или у вас может быть Entity/Attribute/Value, как предложено alex и почтальоном.

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

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

Если я уверен, что знаю каждый «тип», который мне нужен для моделирования, и что мне вряд ли понадобится создавать намного больше в будущем, я бы пошел с наследованием на классной табличке ,

С наследованием на основе таблицы вы можете фильтровать по типу с использованием простого внутреннего соединения (select * from products inner join pants), например, будут выбирать только брюки.

+0

Спасибо за подробное объяснение. Я также предпочитаю наследование классов. – Dreteh

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