Дизайн стола для нескольких различных продуктов на один заказ - PullRequest
3 голосов
/ 07 октября 2010

Если бы у меня был веб-сайт онлайн-покупок, на котором продавались яблоки и мониторы, и они хранились в разных таблицах, потому что отличительное свойство яблок - это цвет, а свойство мониторов - разрешение, как бы я добавил их оба в таблицу счетов, пока еще сохраняя ссылочную целостность и не объединяя эти таблицы?

                        Invoices(InvoiceId)
                                 |
                  InvoiceItems(ItemId, ProductId)
                                 |
                       Products(ProductId)
              |                                            |
Apples(AppleId, ProductId, Colour)   Monitors(MonitorId, ProductId, Resolution)

Ответы [ 4 ]

3 голосов
/ 07 октября 2010

Во-первых, я бы хранил их в одной таблице продуктов, а не в двух разных таблицах.

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

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

1 голос
/ 07 октября 2010

Вопрос к вашей модели данных: вам нужна эталонная схема, которую вы будете использовать для идентификации продуктов?Может быть SKU ?

Затем определите каждое яблоко как продукт, назначив SKU.Аналогично для мониторов.Затем используйте SKU в пункте счета.Примерно так:

ключ продукта {sku} {sku};

ключ invoice_item {invoice_id, sku} {invoice_id, sku};

apple {color, sku}ключ {цвет} ключ {sku};

монитор {размер, sku} ключ {размер} ключ {sku};

с соответствующими ограничениями ... в частности, объединение apple {sku} и монитор {sku} == product {sku}.

0 голосов
/ 07 октября 2010

Мне нравятся таблицы «имя-значение» для них ... Возможно, было бы проще изменить дизайн, чтобы в нем отображалось «Продукт», а затем «Сведения о продукте» ... В сведениях о продукте содержатся идентификатор продукта, тип сведений и затем значение. Это позволит вам держать яблоки и мониторы в одной и той же таблице независимо от идентифицирующего атрибута (и оставить его открытым для последующего добавления другого продукта).

Подобный подход можно использовать в таблице счетов-фактур ... есть столбец «product_type», в котором указывается, какую таблицу нужно просматривать (apple или monitor), а затем «product_id», который ссылается на любой столбец ID в apple / монитор стол. Запросы к настройке, подобной этой, немного сложны и могут вынудить вас использовать динамический sql ... Я бы пошел по этому пути, только если у вас нет контроля над выполнением редизайна выше (и другие ответы, опубликованные здесь, ссылаются)

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

0 голосов
/ 07 октября 2010

Таким образом, таблица счетов имеет FID ProductID, и ProductID может быть либо AppleID (цвет PK), либо MonitorID (разрешение PK)?

Если это так, вы можете ввести ProductTypeID со значениями, такими как 0 = яблоко, 1 = монитор или логическое значение isProductTypeApple, если будет только 2 типа продуктов, и включить их в таблицу ProductID PK.

Вам также необходимо включить поле ProductTypeID в таблицу Apple и таблицу Monitor PK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...