У меня есть следующие основные структуры таблицыMySQL: Нормализация типы контента, категорий и подкатегорий
Содержание
- ID
- TYPE_ID (FK для ContentType)
- category_id (с нулевым значением для категории FK)
- sub_category_id (обнуляемым FK в подкатегорию)
ТипСодержимого
- ID
Категория
- ID
- content_type_id (FK для ContentType)
подкатегорию
- ID
- category_id (FK Категория)
Важно, чтобы категория контента соответствовала его типу.
Аналогично, подкатегория контента должна соответствовать ее категории.
Я знаю, что в настоящее время он широко открыт для несовпадения данных. Например, запись контента может иметь категорию, не разрешенную по ее типу, и подкатегорию, недопустимую по ее категории.
Как я могу изменить структуру таблицы для защиты от этого? Или я должен придерживаться логики приложения?
SCHEMA ПО ТРЕБОВАНИЮ
CREATE TABLE `content_type` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
)
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content_type_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_category_content_type` FOREIGN KEY (`content_type_id`) REFERENCES `content_type` (`id`),
)
CREATE TABLE `sub_category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`category_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_sub_category_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`),
)
CREATE TABLE `content` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type_id` int(10) unsigned NOT NULL,
`category_id` int(10) unsigned DEFAULT NULL,
`sub_category_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_content_type` FOREIGN KEY (`type_id`) REFERENCES `content_type` (`id`),
CONSTRAINT `fk_content_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)
CONSTRAINT `fk_content_sub_category` FOREIGN KEY (`sub_category_id`) REFERENCES `sub_category` (`id`)
)
Прежде всего, если у вас есть подкатегории, вы должны связать их со своим родителем, поэтому в таблице подкатегорий вы должны добавить поле для родительской категории. Во-вторых, неясно, что вы подразумеваете под ** нормализацией **. – FDavidov
В соответствии с логикой приложения это то, для чего предназначены хранимые процедуры/функции. – FDavidov
@FDavidov не уверен, что вы имеете в виду .. есть поле category_id для родительской категории в SubCategory. – Arth