Если вы на 100% уверены, что у вас будет только два уровня категорий (основной и дополнительный), вы можете сделать несколько разных вещей.Ни одно из них не является вашим предлагаемым решением:
CREATE TABLE categories (
id int not null primary key,
main varchar(64)
sub varchar(64)
);
CREATE TABLE objects (
id int not null primary key,
category_id int,
name varchar(64),
FOREIGN KEY (category_id) REFERENCES categories (id)
);
Хотите все автомобили?
SELECT *
FROM objects AS o
INNER JOIN categories AS c ON o.category_id = c.id
WHERE c.main = 'vehicles';
Хотите все рофлкоптеры?
SELECT *
FROM objects AS o
INNER JOIN categories AS c ON o.category_id = c.id
WHERE c.main = 'vehicles' and c.sub='Roflcopters';
Если вы хотите что-то в "категория «транспортное средство», но не во всех подкатегориях транспортных средств, просто есть запись категории, где main = «транспортные средства» с подпунктом NULL.
Конечно, это не особенно гибко.Вы застряли только на двух уровнях категоризации, и в вашей модели категорий не так много бизнес-логики.Но этого может быть достаточно для ваших нужд.
Две другие хорошие, проверенные модели - это модель списка смежности и модель вложенного множества, обе из которых описаны, с множеством хороших примеров кода mysql. здесь