Ниже приведена моя (упрощенная) схема (в версии MySQL 5.0.51b) и моя стратегия ее обновления. Должен быть лучший способ. Для вставки нового элемента требуется 4 поездки в базу данных, а редактирование / обновление элемента занимает до 7 !
items : itemId, itemName
категорий : catId, catName
map : mapId *, itemId, catId
* mapId (varchar) является константой itemId + | + catId
1) При вставке: вставить элемент. Получить itemId через MySQL API.
Другое обновление: просто обновите таблицу предметов. У нас уже есть itemId.
2) Условно пакетная вставка в categories
.
INSERT IGNORE INTO categories (catName)
VALUES ('each'), ('category'), ('name');
3) Выберите идентификаторы из categories
.
SELECT catId FROM categories
WHERE catName = 'each' OR catName = 'category' OR catName = 'name';
4) Условно пакетная вставка в map
.
INSERT IGNORE INTO map (mapId, itemId, catId)
VALUES ('1|1', 1, 1), ('1|2', 1, 2), ('1|3', 1, 3);
Если вставить: мы закончили. Остальное обновление: продолжение.
5) Возможно, мы больше не связываем категорию с этим элементом, который мы делали до обновления. Удалить старые категории для этого элементаId.
DELETE FROM MAP WHERE itemId = 2
AND catID <> 2 AND catID <> 3 AND catID <> 5;
6) Если мы отмежевались от категории, возможно, мы оставили ее сиротой. Мы не хотим категории без предметов. Поэтому, если affected rows > 0
, убейте потерянные категории. Я не нашел способа объединить их в MySQL, так что это # 6 и # 7.
SELECT categories.catId
FROM categories
LEFT JOIN map USING (catId)
GROUP BY categories.catId
HAVING COUNT(map.catId) < 1;
7) Удалить идентификаторы, найденные на шаге 6.
DELETE FROM categories
WHERE catId = 9
AND catId = 10;
Пожалуйста, скажите мне, что есть лучший способ, которого я не вижу.