Как организовать таблицы MySQL?

Статус
Закрыто для дальнейших ответов.

localhot

New Member
Регистрация
08.11.2011
Сообщения
5
Есть таблица с описанием модели устройства model (поля id, name, brand, deviceType, …)

Для каждой модели нужно сохранить комплектацию, например, в продажный комплект модели М1 входят комплектующие К1 (в количестве Х1), К2 (в кол-ве Х2), … Кn (в кол-ве Хn).

Кол-во комплектующих для каждой модели может быть разным.

Не знаю, как лучше организовать таблицы. Напрашивается вариант сделать отдельную таблицу с комплектацией по каждой модели (с полями id, name, number, … ), в которую все легко и гармонично поместится, а в табл. model в соотв. колонке указать название табл. с комплектацией по данной модели (например, kompl23).

Но тогда получится несколько тысяч таблиц с комплектациями (по числу моделей). Так вообще делают?..

Как объединить эту кучу таблиц в одну, не представляю.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
ваша таблица model (id, name, brand ...и тд)
ещё одна таблица:
complect (id, id_model, name_komplekt), в которой:
id_model - id вещи из вашей первой таблицы
name_komplekt - вещь из комплекта
Вот пример:
таблица model
1 | Жвачка | Стиморол
2 | ещё чет | второй брэнд|

Таблица complekt
1 | 1 | Жвачка в виде подушечки
2 | 1 | Красивая упаковка
3| 1| Красивая надпись STIMOROL

Теперь пользователю надо вывести всё об этом стимороле, из чего он состоит и остальное.
Делаем запрос в первую таблицу и всё выводим, затем берем id этой вещи и делаем точно такой же запрос во вторую таблицу, примерно такой:
$id - это id стиморола в первой таблице
Код:
select * from `complekt` where `id_model`='$id';
Теперь циклом можно вывести всё то, из чего состоит этот стиморол
Возможна куча ошибок, если что-то не понятно - спрашивай.
 

localhot

New Member
Регистрация
08.11.2011
Сообщения
5
Я думал о чем-то подобном, "стыковочной" таблице если я это правильно понимаю. Только я не догадался, куда поместить кол-во данной позиции в данном комплекте, а, посмотрев Ваш вариант, думаю, лучше всего в эту самую стык-таблицу, model_komplekt (или complect , как называется у Вас).

Тогда получаем 3 таблицы:

model (id, name, brand ...и тд)
komplekt (id, name, makersCode1, …)
model_komplekt (id, modelID, komplektID, number) или komplektName, не принципиально

В табл. komplekt приведены все комплектующие для всех моделей.
В табл. model_komplekt стыкуются id модели и комплектующего изделия, а number означает кол-во данного изделия в комплекте данной модели.

Тогда, чтобы узнать комплектацию для модели с id = 3, получим что-то вроде:

Код:
$sql = "
SELECT k.name, mk.number
FROM komplekt AS k, model_komplekt AS mk
WHERE mk.modelID = 3 AND k.id = mk.komplektID
";
Как Вы считаете?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Я думал о чем-то подобном, "стыковочной" таблице если я это правильно понимаю. Только я не догадался, куда поместить кол-во данной позиции в данном комплекте, а, посмотрев Ваш вариант, думаю, лучше всего в эту самую стык-таблицу, model_komplekt (или complect , как называется у Вас).

Тогда получаем 3 таблицы:

model (id, name, brand ...и тд)
komplekt (id, name, makersCode1, …)
model_komplekt (id, modelID, komplektID, number) или komplektName, не принципиально

В табл. komplekt приведены все комплектующие для всех моделей.
В табл. model_komplekt стыкуются id модели и комплектующего изделия, а number означает кол-во данного изделия в комплекте данной модели.

Тогда, чтобы узнать комплектацию для модели с id = 3, получим что-то вроде:

Код:
$sql = "
SELECT k.name, mk.number
FROM komplekt AS k, model_komplekt AS mk
WHERE mk.modelID = 3 AND k.id = mk.komplektID
";
Как Вы считаете?
А зачем таблица со стыковкой? о_О
Можно добавить в обе таблицы по столбцу number и всё. В таблице model столбец "number" будет обозначать колличество изделий на складе или ещё где-то, а в таблице "komplekt" столбец "number" будет обознать колличество составляющих компонентов.
Код:
//id комплекта (модели)
$id=3;
//Ищем такую модель по базе
$sql=mysql_query("select*from `model` where `id`='$id'");
if(mysql_num_rows($sql)>0){
$mas = mysql_fetch_assoc($sql);
echo 'Название: '.$mas['name'].', Брэнд: '.$mas['brand'].'<br>Колличество на скалде: '.$mas['number'].'<br><b>Составляющие части:</b><br>';
//Ищем составные части модели
$sql2=mysql_query("select*from `komplekt` where `id_model`='$id'");
if(mysql_num_rows($sql2)>0){
while($mas2 = mysql_fetch_assoc($sql2)){
echo 'Название составной части:'.$mas2['name'].'<br>Колличество в комплекте:'.$mas2['number'].'<br>';
}
}
else{echo 'Составные части комплекта отсутствуют';}
}
else{echo 'Комплект не найден';}
 

localhot

New Member
Регистрация
08.11.2011
Сообщения
5
А зачем таблица со стыковкой? о_О
Идея была в том, что позиции в табл. komplekt уникальны и еще - некоторые из них используются в нескольких моделях. Например,

model:
id name ...
1 Набор для скромных
2 Набор для гурманов

komplekt:
id name ...
1 Буханка хлеба
2 Уцененное масло
3 Икра белужья
4 Сыр дорогой с плесенью

model_komplekt:
id model_ID komplekt_ID number_for_model
1 1 1 0.5
2 2 3 2
3 2 4 1

Если выберем из базы комплект "модели" Для скромных, получится - полбуханки хлеба
Для гурманов - 2 икры и 1 сыр

И еще - как я понимаю, в Вашем варианте будут повторяющиеся позиции в табл. komplekt - по одной для каждой модели, - надо повторять, даже если позиции полностью совпадают?

И что важно, позиции из табл. komplekt могут в разном кол-ве использоваться для разных моделей.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ