Как я могу структурировать таблицу так, чтобы поле оставалось атомарным? - PullRequest
1 голос
/ 17 июня 2009

У меня есть корзина для покупок, в которой я должен отслеживать запасы, и это включает в себя запасы с атрибутами. Например:

shirt
 -- blue, small  = 50
 -- blue, medium = 22
 -- blue, large  = 53
 -- red,  small  = 15
 etc...

Эти поля в настоящее время разделены запятыми в базе данных, и идентификаторы будут следующими:

1,3
1,4
1,5
2,3

, где каждое число представляет определенный атрибут (1 = синий, 3 = маленький). Проблема заключается в том, что с этим становится очень трудно работать, поскольку данные не являются атомарными в базе данных, но я не могу думать, как структурировать таблицу, поскольку может быть бесконечно много комбинаций элементов, таких как:

blue, small, long-sleeved

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

Ответы [ 2 ]

4 голосов
/ 17 июня 2009

Стол: рубашка {shirt_id}

Таблица: ShirtAttributeDefinitions {attribute_id, attribute_description}

Таблица: ShirtAttribute {shirt_id, attribute_id}

таким образом, вы можете продолжать определять новые атрибуты ShirtAttributes, добавляя записи в Table: ShirtAttributeDefinitions.

Пример:

у вас есть две рубашки: {shirt_id: 1}, {shirt_id: 2}

у вас есть пять атрибутов рубашки: {attribute_id: 1, attribute_description: blue}, {attribute_id: 2, attribute_description: small}, {attribute_id: 3, attribute_description: ladies}, {attribute_id: 4, attribute_description: red}, { attribute_id: 5, attribute_description: men}

Теперь ваша первая рубашка - голубая маленькая женская рубашка, а вторая - красная мужская рубашка. Таким образом, ваша таблица ShirtAttribute будет иметь следующие записи:

{shirt_id: 1, attribute_id: 1}, {shirt_id: 1, attribute_id: 2}, {shirt_id: 1, attribute_id: 3}, {shirt_id: 2, attribute_id: 4}, {shirt_id: 2, attribute_id: 5}

Хотя этот подход работает, лучше всего сделать эти атрибуты полями таблицы Shirt. Таким образом, вы можете быть уверены, что рубашка не имеет атрибутов «мужской» и «женский». Этот метод - просто грязный подход, который строго соответствует вашему вопросу.

JRH.

1 голос
/ 17 июня 2009

что не так с таблицей атрибутов?

create table Attributes (
    Id int not null identity etc,
    CartItemId int not null foreign-key etc,
    Name nvarchar(32),
    Value nvarchar(32)
)

...