[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Что же делать с базой и таблицами
Эли4ка
Здравствуйте, форумчане. Возникла очень неприятная задача. Раньше была таблица, в которой хранилось все в таком виде:

CREATE TABLE `table_one` (
`id` SMALLINT(5) UNSIGNED NOT NULL ,
`name` VARCHAR(60) NOT NULL ,
`type_id` SMALLINT(5) UNSIGNED NOT NULL,
`category_id` SMALLINT(5) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = MyISAM;

То есть раньше type_id и category_id хранились в единственном экземпляре. Теперь и типов и категорий может быть несколько. То есть нужно делать связь многие ко многим для этих двух полей. То есть отдельно таблицу для названия категорий и связующую таблицу между категориями и table_one. А так же таблицу для типов и связующую для типов и table_one.
Примерно все это так( и новый вариант таблицы ):

CREATE TABLE `table_one` (
`id` SMALLINT(5) UNSIGNED NOT NULL ,
`name` VARCHAR(60) NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE = MyISAM;
CREATE TABLE `Types` (
`id` SMALLINT(5) UNSIGNED NOT NULL ,
`name` VARCHAR(20) NOT NULL
) ENGINE = MyISAM;
CREATE TABLE `Categories` (
`id` SMALLINT(5) UNSIGNED NOT NULL ,
`name` VARCHAR(20) NOT NULL
) ENGINE = MyISAM;
CREATE TABLE `One_Types` (
`name_id` SMALLINT(5) UNSIGNED NOT NULL ,
`type_id` SMALLINT(5) UNSIGNED NOT NULL
) ENGINE = MyISAM;
CREATE TABLE `One_Categories` (
`name_id` SMALLINT(5) UNSIGNED NOT NULL ,
`category_id` SMALLINT(5) UNSIGNED NOT NULL
) ENGINE = MyISAM;

И если был раньше один запрос для вставки в таблицу. То как быть сейчас? Куда вставлять в первую очередь?(пошлые шутки отставить)
Вот допустим запрос для первой таблицы:
name - Наука
category - наука, образование
type - знание, ум
Как я сейчас представляю алгоритм:
0. Вставляем имя в первую таблицу и получаем id
1. explode разбиваем строку category
2.0 открываем цикл
2.1 валидация, подготовка
2.2 делаем SELECT в Categories для получения id по имени
2.3 делаем INSERT в One_Categories с name_id, category_id
2.4 цикл закрываем
3. explode разбиваем строку type
3.0 открываем цикл
3.1 валидация, подготовка
3.2 делаем SELECT в Type для получения id по имени
3.3 делаем INSERT в One_Types с name_id, type_id
3.4 цикл закрываем
То есть раньше было 4 запроса(
SELECT для получения типа по имени
SELECT для получения категории по имени
SELECT что имени не было
INSERT строки итоговой строки
), то сейчас минимум 6(
SELECT для получения типа
INSERT в связующую таблицу One_Types

SELECT для получения категории
INSERT в связующую таблицу One_Categorie

SELECT что имени не было
INSERT строки
). Имя не может быть без хотя бы одной категории или одного типа.
Какие уже узкие места вижу - если в процессе вставки типа или категории строка не вставилась, как откатить уже ранее сделанные записи в тех таблицах, в которых вставилось нормально? Была идея перед вставкой в первую таблицу присваивать уникальное имя, типа хэша и если где-то возникла ошибка вставки опрашивать все эти таблицы и удалять записи в них по этому уникальному имени. Может есть как-то на уровне самой БД? Типо внешних ключей и ON DELETE и ON UPDATE?
И потом запросы в цикле мне не нравятся очень, но как сделать без цикла тоже не знаю.
Надеюсь на помощь, спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.