Цитата:первая таблица где товары относятся к категории мебели,
вторая таблица для товаров для кухни
и третяя таблица для товаров электро-приборов
Это мне понятно. Но так получается - мы искусственно усложняем структуру БД. Создаем дополнительные таблицы, хотя с точки зрения решения задачи в них нет необходимости. Ведь для хранения информации о структуре каталога продукции достаточно двух таблиц (даже одной - но получится нерациональное расходование полей). Я здесь провожу аналогию с файловой системой - есть каталоги (директории) и есть файлы (почему я говорю - достаточно одной таблицы - потому что директория - это тоже файл, только особого вида).
Цитата:
Таблица CATEGORIES:
1;0;Извещатели охранные;1
2;0;Извещатели пожарные;2
3;0;Приборы приемно-контрольные;3
6;1;Извещатели охранные магнитоконтактные;1
7;1;Извещатели охранные электроконтактные;2
8;1;Извещатели охранные ударноконтактные;3
9;2;Извещатели пожарные тепловые;1
10;2;Извещатели пожарные дымовые;2
11;2;Извещатели пожарные комбинированные;3
17;3;Приборы приемно-контрольные охранные;1
18;3;Приборы приемно-контрольные пожарные;2
19;3;Приборы приемно-контрольные охранно-пожарные;3
Таблица PRODUCTS:
1;6;Извещатель охранный магнитоконтактный ИО 102-2;Технические характеристики ИО 102-2;1
2;6;Извещатель охранный магнитоконтактный ИО 102-4;Технические характеристики ИО 102-4;2
3;6;Извещатель охранный магнитоконтактный ИО 102-14;Технические характеристики ИО 102-14;3
4;7;Извещатель охранный электроконтактный ИО 201-1;Технические характеристики ИО 201-1;1
5;7;Извещатель охранный электроконтактный ВПК 2112;Технические характеристики ВПК 2112;2
6;8;Извещатель охранный ударноконтактный "Окно-4";Технические характеристики "Окно-4";1
7;8;Извещатель охранный ударноконтактный "Окно-5";Технические характеристики "Окно-5";2
8;8;Извещатель охранный ударноконтактный "Окно-6";Технические характеристики "Окно-6";3
9;9;Извещатель пожарный тепловой ИП 114-01;Технические характеристики ИП 114-01;1
10;9;Извещатель пожарный тепловой ИП 101-1A;Технические характеристики ИП 101-1A;2
11;9;Извещатель пожарный тепловой ИП 101-30;Технические характеристики ИП 101-30;3
12;10;Извещатель пожарный дымовой ИП 212-3СМ;Технические характеристики ИП 212-3СМ;1
13;10;Извещатель пожарный дымовой ИП 212-18СИ;Технические характеристики ИП 212-18СИ;2
14;11;Извещатель пожарный комбинированный ИП 212/101-78-А1;Технические характеристики ИП 212/101-78-А1;1
15;11;Извещатель пожарный комбинированный ИП 212/101-18 А3R1;Технические характеристики ИП 212/101-18 А3R1;2
В этих двух таблицах я могу хранить каталоги продукции 2, 3, 10, 20 разных фирм (одно условие - придется добавить дополнительное поле - идентификатор фирмы, которой принадлежит категория или товар).
Мне интересно знать, как разбить эти таблицы, если они слишком разростутся (или будут изначально велики)? Получается, я должен буду изменить все запросы к этой таблице (а точнее - уже к трем), если разобью ее на части?
P.S. Почему я проявляю столь живой интерес к этой теме - просто много раз слышал о проблеме большого количества записей. И хочется быть готовым к этой ситуации, если она вдруг случится.
Цитата:Дело в том что в 15 000 строковой таблице будет слишком много строк удовлетворяющих условие Char = A & num = 1 , поэтому системных ресурсов для вычисления и запоминания, а потом сортировки по этому числу - уходить будет очень много.
Можно ещё сделать чтото вроде такого:
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 AND `id`=$rnd
и повторять эту комбинацию циклом while пока из базы чтото не выберется.
Согласен. Единственно, что я бы еще сделал - попробовал все варианты и засек бы время на выплнение. Но это не дает никаких гарантий - потому как у разных хостеров может быть по-разному. У одного PHP и MySQL на одной машине, у другого - на разных. И т.п.
(Добавление)
Мне не спится. Поэтому продожу. Пусть у нас есть фирма, которая предоставляет услуги хостинга и одновременно - услуги создания сайтов. Каждый сайт, создаваемый этой фирмой имеет каталог продукции (может быть и с Интернет-магазином). Все сайты работают на одном движке. Вся информация о продукции этих фирм хранится в двух таблицах CATEGORIES и PRODUCTS. Чтобы не заморачиваться каждый раз с модификацией движка (передавая в запросы уникальный идентификатор фирмы id_firm), эта фирма создает в БД представления (view)
CREATE VIEW CATEGORIES_FIRM1 AS
SELECT * FROM CATEGORIES WHERE id_firm=1
CREATE VIEW PRODUCTS_FIRM1 AS
SELECT * FROM PRODUCTS WHERE id_firm=1
CREATE VIEW CATEGORIES_FIRM2 AS
SELECT * FROM CATEGORIES WHERE id_firm=2
CREATE VIEW PRODUCTS_FIRM2 AS
SELECT * FROM PRODUCTS WHERE id_firm=2
CREATE VIEW CATEGORIES_FIRM3 AS
SELECT * FROM CATEGORIES WHERE id_firm=3
CREATE VIEW PRODUCTS_FIRM3 AS
SELECT * FROM PRODUCTS WHERE id_firm=3
А потом достаточно создать файл конфигурации config.ini следующего содержания
define("CATEGORIES", "CATEGORIES_FIRM1");
define("PRODUCTS", "PRODUCTS_FIRM1");
для первой фирмы
define("CATEGORIES", "CATEGORIES_FIRM2");
define("PRODUCTS", "PRODUCTS_FIRM2");
для второй фирмы
и т.д.
А в самом движке при необходимости обращения к таблице товаров пишем
$query = "SELECT id_prd, title, description, price FROM ".PRODUCTS." WHERE id_prd=".$id_prd;
При этом для первой фирмы будет идти обращение к представлению PRODUCTS_FIRM1, для второй - к PRODUCTS_FIRM2 и т.д.
Вопрос, который я хотел задать - если таблица PRODUCTS становится слишком велика - как ее грамотно разбить на части и как к эти частям обращаться?