Сложная проблема структуры данных MySQL / манипуляции

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

Справочная информация о базе данных:

У меня есть таблица продуктов, переменных и цен. «Продукты» - это основная информация о продукте (описание, название и т. Д.). "Цены" содержат информацию о каждой цене (цена, стоимость, минимальное количество, стоимость доставки и т. Д.), Поскольку у некоторых продуктов может быть более одной цены (например, 10-дюймовый виджет - это цена, отличная от 12-дюймового). . " «Переменные» - это вариации продукта, которые не меняют цену, например цвет, размер и т. Д.

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

Например, виджет (продукт) может быть размером 10 дюймов или 12 дюймов и продаваться за 10 и 20 долларов (цены) соответственно. Однако, хотя 10-дюймовый виджет может быть доступен в синем и красном цвете (переменные), 12 "виджет доступен только в красном цвете. Мы решили эту проблему, добавив небольшой оператор в скобках в неконгруэнтную переменную, например" Красный (ТОЛЬКО 10 ")". Такие работы, Я понял, что это только часть проблемы, так как я (по крайней мере, для первоначального преобразования базы данных) хочу, чтобы каждая переменная была указана как связанная с каждой ценой для данного продукта.

Для этого я создал другая таблица, например:

tblvariablesprices
variablepriceid | variableid | priceid | productid

, которая представляет собой "многие ко многим" с таблицей переменных.

Проблемы:

Моя проблема в том, что я не знаю, как создавать строки. Я могу создать левое соединение в своих таблицах цен и переменных, чтобы получить (я думаю) все необходимые данные, я просто не знаю, как это пройти. Мой sql (mysql 5.0):

SELECT p.priceid, p.productid, variableid, labelid 
FROM tblprices p 
LEFT JOIN tblvariables v ON p.priceid = v.priceid 
ORDER BY productid, priceid

Это даст мне все идентификаторы цены и продукта, а также все соответствующие идентификаторы переменных и меток. Это хорошо в определенных случаях, например, когда у меня есть что-то вроде:

priceid | productid | variableid | labelid
2       | 7         | 10         | 4
2       | 7         | 11         | 4
2       | 7         | 12         | 4
3       | 7         | (null)     | (null) --- another price for product

, потому что теперь я знаю, что мне нужно создать запись для priceid 2 и variableids 10, 11, 12, а затем также для priceid 3 для этого продукта. Однако я также получаю результаты из этого набора данных для продуктов без переменных, продуктов с одной ценой и несколькими переменными, а также продуктов с несколькими ценами и без переменных, например:

priceid | productid | variableid | labelid
2       | 7         | 10         | 4
2       | 7         | 11         | 4
2       | 7         | 12         | 4
3       | 7         | (null)     | (null)
4       | 8         | (null)     | (null) --- 1 price no variables
5       | 9         | 13         | 5      --- mult vars, 1 price
5       | 9         | 14         | 5
5       | 9         | 15         | 6
5       | 9         | 16         | 6
6       | 10        | (null)     | (null) --- mult price, no vars
7       | 10        | (null)     | (null)
8       | 10        | (null)     | (null)

Взяв вышеуказанный набор данных, я хочу добавить записи в свой Таблица tblpricesvariables выглядит так:

variablepriceid | variableid | priceid | productid
1               | 10         | 2       | 7
2               | 11         | 2       | 7
3               | 12         | 2       | 7
4               | 10         | 3       | 7
5               | 11         | 3       | 7
6               | 12         | 3       | 7
7               | 13         | 5       | 9
8               | 14         | 5       | 9
9               | 15         | 5       | 9
10              | 16         | 5       | 9

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

Большое спасибо за то, что прочитали все это и помогли мне.

5
задан Jason 10 February 2011 в 19:59
поделиться