Какой лучший способ сохранить мою структуру данных в базе данных? - PullRequest
1 голос
/ 09 марта 2011

Я строю интернет-магазин, и у меня проблема.У меня будут продукты с прямой ценой (например, HTC Touch 2 Smartphone: $ 299,00), но в то же время у меня будут продукты с ценами на комбинации, основанные на разновидностях: например:

product: Nike Exclusive T-Shirt 2011
varieties: 
   Sizes: L, XL
   Colors: red, blue
combinations will be: 
L white - $10
XL white - $15
L blue - $11
XL blue - $16

Мне нужен лучший способ (или только один работающий :)) структуры базы данных, где я могу хранить оба типа продуктов, и если я хочу перечислить свои продукты из категории, которая содержит оба типа продуктов на веб-странице (одна ценаНесколько цен) Я могу построить запрос MySQL, чтобы получить все продукты в одном запросе.

спасибо

ОБНОВЛЕНИЕ

У меня наверняка будут следующие таблицы: [products], [varieties] (цвет, размер), [varietyValues] (где хранится какой королькакие цвета и какие размеры у продукта - каждый из них представляет собой строку в таблице {productId +ietyId + value (красный, S, M, зеленый, XL и т. д.))).После этого у меня будет другая таблица [combinations] с отношением «многие ко многим [n-to-m]» между [combinations] и [varietyValues], что приведет к созданию новой таблицы [combPrices].Каждая строка этой новой таблицы n-to-m будет иметь цену.

Теперь проблема в том, что я не могу понять, как хранить продукты с одинарной ценой в этой структуре данных.


ОБНОВЛЕНИЕ 2

На этом изображении вы можетесм. диаграмму базы данных, которая, я думаю, была бы приемлема для продуктов с несколькими ценами: database diagram

ОСНОВНАЯ ПРОБЛЕМА: Поскольку это интернет-магазин, люди будут помещать товары в корзину.Я думаю, что элементы, вставленные в корзину, должны быть из той же таблицы (в нашем случае это будет таблица [combinations], так как сохранены цены).

Вот некоторые данные для этих таблиц,просто чтобы быть более понятным:

[products]

productid   |   productName
1           |   Nike T-Shirt
2           |   HTC Touch 2 Smartphone

[specifications]

specId   |   productId   |   specName
1        |   1           |   Size
2        |   1           |   Color

[specvalues]

specValueId   |   specId   |   svValue
1             |   1        |   L
2             |   1        |   XL
3             |   2        |   white
4             |   2        |   blue
5             |   2        |   red

[combinations] (товаров в корзину)

combinationId   |   price   |   description
1               |   10      |   White L Nike T-Shirt
2               |   15      |   White XL Nike T-Shirt
3               |   11      |   Blue L Nike T-Shirt
4               |   16      |   Blue XL Nike T-Shirt
5               |   18      |   Red XL Nike T-Shirt

[combinationParts]

nmid   |   combinationId   |   specValueId
1      |   1               |   1
2      |   1               |   3
3      |   2               |   2
4      |   2               |   3
5      |   3               |   1
1      |   3               |   4
2      |   4               |   2
3      |   4               |   4
4      |   5               |   2
5      |   5               |   5

Надеюсь, моя диаграмма и база данных имеют смысл :).

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

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

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

SELECT p.productid, 
       p.productname, 
       CASE 
         WHEN cb.combinationid > 0 THEN cb.price 
         ELSE p.price
       END, 
       cb.combinationid 
FROM   products p 
       LEFT JOIN specifications sp 
         ON sp.productid = p.productid 
       LEFT JOIN specvalues spv 
         ON spv.specid = sp.specid 
       LEFT JOIN combinationparts cbp 
         ON cbp.specvalueid = spv.specvalueid 
       LEFT JOIN combinations cb 
         ON cb.combinationid = cbp.combinationid 
WHERE  p.productid IN ( 1, 2 ) 
       AND CASE 
             WHEN cb.combinationid > 0 THEN cb.combinationid IN ( -100, 1, 2 ) 
             ELSE 1 = 1 
           END 

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

2 голосов
/ 09 марта 2011

Почему бы вам просто не добавить пустую колонку цен в таблицу продуктов?

Если вы хотите легко получить доступ ко всем ценам с помощью одного запроса, вы можете использовать представление:

create view combPrices as
select ProductID, null as Variety, Price from tbProducts where Price is not null
union
select tbProductDesc.ProductID, tbProductDesc.Variety, tbProductDesc.Price 
from tbProducts
inner join tbProductDesc on tbProducts.ProductID = tbProductDesc.ProductID
1 голос
/ 09 марта 2011

Хм, похоже, вам понадобятся две таблицы с отношением один ко многим.
Что-то вроде: (Psudocode)

Products
   ProductID int autoincrement
   ProductName text

ProductDesc
   ProductDescID int autoincrement
   ProductID int foreign_key
   ProductDescription text
   Price float

Таким образом, вы должны заполнить его следующим образом:1005 *

Products
   1 'HTC Touch 2'
   2 'White Shirt'
   3 'Blue Shirt'
   4 'Nike Exclusive T-Shirt 2011'

ProductDesc
   1 1 'Smartphone' 299.00
   2 2 'Large' 10.00
   3 2 'XL' 15.00
   4 3 'Large' 11.00
   5 3 'XL' 16.00
   6 4 'L White' 10.00 
   7 4 'XL White' 15.00
   8 4 'L blue' 11.00
   9 4 'XL blue' 16.00

Тогда не имеет значения, будет ли товар иметь одну или несколько цен.

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