Модель данных, сохраняющая свойства товара в отдельной таблице? - PullRequest
1 голос
/ 25 августа 2011

У меня есть таблица продуктов "продукты"

продукты- proID (PK)- proName- описание- цена- proSize- proStatus

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

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

Это лучше?добавить свойства в таблицу продуктов или создать отдельную таблицу для хранения этих свойств и значений?

Я мог бы хранить их как:

product_properties- pprID (PK)- pprName

product_properties_values- pprID (PK)- proID (PK)- ppvValue

Ответы [ 4 ]

1 голос
/ 25 августа 2011

Это проблема Сущность - Атрибут - Значение .Для лучшей масштабируемости вы должны использовать одну таблицу для продуктов, одну для свойств и одну для значений.Как вы писали:

product_properties

  • pprID (PK)
  • pprName

product_properties_values ​​

  • pprID (PK)
  • proID (PK)
  • ppvValue

Вы можете легко запросить таблицы с помощью оператора mysql left join.Например, каковы свойства продукта X?

select ppr.pprName, ppv.ppvValue
from products as pro 
left join product_properties_values as ppv on pro.proID=ppv.proID 
left join product_properties as ppr on ppr.pprID=ppv.pprID 
where pro.proName='X' order by ppr.pprName desc
1 голос
/ 25 августа 2011

Если вы хотите иметь нормализованную схему , вы можете создать таблицу product_type со списком всех этих свойств, которые может иметь продукт.

таблица_продукта_типа:

  • идентификатор_идентификатора
  • имя_произведения
  • type_property_1
  • type_property_2
  • и т. Д.

и таблица продуктов:

  • product_id
  • type_id
  • и т. Д.

Преимущество наличияОтдельная таблица type состоит в том, что она, вероятно, будет небольшой, поэтому будет относительно легче вносить изменения, такие как добавление новых свойств в будущем.Кроме того, это сэкономит дисковое пространство.

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

1 голос
/ 25 августа 2011

Другим способом является использование поля с текстом, в котором хранятся все поля в формате xml или json.В нашем проекте мы используем xml, потому что нам нужен поиск по свойству.Вы можете осуществлять поиск по любому свойству с помощью функции ExtractValue mysql.

См. http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_extractvalue

Но если вам не нужен поиск, json будет работать быстрее.

0 голосов
/ 25 августа 2011

Звучит как модель EAV (Entity-Attribute-Value).
Вы можете Google для получения дополнительной информации об этом.
Некоторым нравится EAV, но многие думают, что база данных плохая.

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

...