Вопрос по структуре РБД

12
P
На сайте с 16.06.2008
Offline
14
1101

Есть несколько групп товаров, например ноутбуки и телефоны.

У них общая таблица "articles", в которой есть:

id

name

manufacturer

...

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

Например, у телефонов это (полифония, дисплей, размер, вес и т.д.).

У ноутбуков это (дисковод, размер экрана, usb порты и т.д.).

Получается, что таблицу параметров мы связываем с общей таблицей один-к-одному по полю id.

Как выбрать данные о товаре из общей таблицы и таблицы параметров имея лишь ID?

Неужели единственный выход - это создать дополнительное поле в общей таблице и заносить туда названия таблиц?

Brand from Amber
На сайте с 18.08.2007
Offline
293
#1
  • Добавить в articles поле group_id, которое будет содержать id таблицы параметров.
  • Добавить таблицу group_name содержащую связи между group_id и именем таблиц параметров.

Этот вариант будет более экономичный в плане размера БД (в сравнении с Вашим вариантом), но добавит +1 запрос. Для того что бы убрать лишний запрос можно попробовать "извращнуться" с наименованием таблиц параметров численными именами... т.е. "название таблицы параметров" = group_id = 1 :-) ... но в целом Вы правы - выбирая данные из таблицы нужно знать её название.

Лучший способ понять что-то самому - объяснить это другому.
DR
На сайте с 18.08.2007
Offline
59
#2

SELECT * FROM catalog LEFT JOIN group ON (catalog.group_id=group.id)

Из двух таблиц одним заросом данные по одному id.

Или что вы имеете ввиду?

Com2b.ru - профессиональное создание Интернет-сайтов (http://www.com2b.ru). Ufa-host.ru - лучший хостинг поволжья и урала (http://www.ufa-host.ru).
P
На сайте с 16.06.2008
Offline
14
#3

Brand from Amber, в обоих случаях это связь не поле-поле, а поле-таблица, целостность которой никак не может быть проконтролирована средствами mysql!?

Brand from Amber
На сайте с 18.08.2007
Offline
293
#4

prometex, ну... триггеры (выполняющиеся при удалении товара из таблицы articles), думаю, тут помогут.

Brand from Amber добавил 16.06.2008 в 23:43

DenisR:
SELECT * FROM catalog LEFT JOIN group ON (catalog.group_id=group.id)

Если не сложно, не могли бы Вы прокомментировать работу данного запроса... т.е. как он работает (поэтапно и на примерах) ? 🙄

DR
На сайте с 18.08.2007
Offline
59
#5
Brand from Amber:
Если не сложно, не могли бы Вы прокомментировать работу данного запроса... т.е. как он работает (поэтапно и на примерах) ? 🙄

SELECT * FROM catalog - выбрать все поля из таблички catalog

LEFT JOIN group - а также таблички group

ON (catalog.group_id=group.id) - там где и в скобочках условие:

в таблице catalog поле group_id совпадает с полем id таблицы group.

Таким образом в одной строке мы получаем записи из таблицы catalog и соответствующую группе полную информацию из второй таблички.

Это очень на пальцах, читайте лучше документацию, она есть.

Brand from Amber
На сайте с 18.08.2007
Offline
293
#6

DenisR, спасибо большое, а теперь внимательно прочитайте первый пост и сопоставьте ваше "LEFT JOIN group - а также таблички group" и "У каждой группы товаров есть свои параметры, которые хранятся в отдельных таблицах".

Подсказка - имя таблицы параметров неизвестно (оно можеть быть group, group1, ... groupN), но id товара в этих таблицах не повторяется.

Bor-ka
На сайте с 16.11.2004
Offline
256
#7
Brand from Amber:
Подсказка - имя таблицы параметров неизвестно (оно можеть быть group, group1, ... groupN), но id товара в этих таблицах не повторяется.

кто такое извращение придумал? Нормализуйте базу и не парьте мозги:

http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0

P
На сайте с 16.06.2008
Offline
14
#8
Bor-ka:
кто такое извращение придумал? Нормализуйте базу и не парьте мозги:

Как раз этим и занимемся. Какое предложение то?

Bor-ka
На сайте с 16.11.2004
Offline
256
#9

prometex,

вынести все параметры в одну таблицу, где отдельным полем будет соответственно ID товара.

P
На сайте с 16.06.2008
Offline
14
#10
Bor-ka:
prometex,
вынести все параметры в одну таблицу, где отдельным полем будет соответственно ID товара.

Если взять 50 груп товаров, и у каждой группы по 20 параметров, то получится таблица параметров у которой будет 1000 полей. При вставке данных одного товара заполняются только 20 полей - остальные 880 останутся пустыми?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий