#mysql #sql #database #mariadb
#mysql #sql #База данных #mariadb
Вопрос:
Я использую MariaDB и phpMyAdmin, но мой код полностью нейтрален, поэтому я рад переключиться на Postgres или что-то еще, но это должно быть достаточно просто. Я еще ничего не разработал, только после лучших подходов.
У меня есть 3 таблицы базы данных, которые описывают помещение. Допустим, отель.
В этом теоретическом отеле есть несколько заведений — 2 ресторана и бар. У каждого из них есть несколько разных комнат / областей. В этих залах есть столики, за которыми клиенты могут посидеть.
В SQL я полагаю, что таблицы будут выглядеть следующим образом
Места |
---|
Идентификатор места | Имя места |
---|---|
1 | Ресторан 1 |
2 | Ресторан 2 |
3 | Бар |
Комнаты |
---|
Идентификатор комнаты | Имя комнаты | Родительское место (внешний ключ) |
---|---|---|
1 | Внутренний дворик | 1 |
2 | Функциональная комната | 1 |
3 | Ниша | 3 |
4 | Частная столовая | 2 |
Таблицы |
---|
Идентификатор таблицы | Имя таблицы | Родительская комната (внешний ключ) |
---|---|---|
1 | Таблица 1 | 1 |
2 | Таблица 2 | 1 |
3 | Таблица 3 | 1 |
4 | Таблица 4 | 2 |
5 | Таблица 1 | 3 |
6 | Таблица 2 | 3 |
7 | Таблица 3 | 3 |
8 | Таблица 4 | 3 |
9 | Таблица 1 | 4 |
10 | Таблица 2 | 4 |
11 | Таблица 3 | 4 |
Я надеюсь, что данные верны: p
Что я хочу сделать, так это определить связь, тогда как невозможно добавить имя таблицы, если оно уже существует в этом месте. Не имеет значения, в какой комнате находится таблица.
Например, если бы я добавил еще одну «Таблицу 4», ее удалось бы ввести, если бы она была введена в комнату 4, поскольку комната 4 принадлежит ресторану 2, в котором еще нет «Таблицы 4». Однако, если бы он был введен в любую другую комнату, он потерпел бы неудачу, поскольку в ресторане 1 и баре уже есть «Таблица 4» в одной из их комнат.
Теперь в коде на стороне сервера это довольно легко проверить, поскольку я могу выполнять несколько запросов или объединений или множество других способов, однако мне было интересно, как сделать это напрямую в SQL / phpMyAdmin. У меня возникли небольшие проблемы с поиском моего администратора.
Приветствия
Ответ №1:
Моя рекомендация состоит в том, чтобы избыточно включать родительское место проведения в таблицу tables. Так tables
что был бы дополнительный столбец:
venueID
rooms
будет иметь уникальное ограничение (которое является избыточным):
alter table rooms add constraint unq_rooms_venueId
unique (venueId, roomId);
Тогда таблицы будут иметь уникальное ограничение:
alter table tables add constraint unq_table_venueId
unique (tableName, venueId);
Это решает проблему без необходимости прибегать к триггерам.
Комментарии:
1. Да, таково было мое первоначальное предположение, просто я не знал, есть ли простой способ сделать дополнительный шаг. Спасибо!
2. @joshredge . , , Это на самом деле «простой» способ. Альтернатива включает триггеры.
3. Чего я рад избежать, сделаю ответ, как только смогу!
Ответ №2:
Что я бы сделал, так это переключился с технических идентификаторов на составные естественные ключи. Для этого вы можете использовать numbers (т. Е. Присвоить месту проведения номер, номер комнаты, возможно, номер таблицы) или использовать имена, если они гарантированно не изменятся. Например.:
venues
(
venue_name,
primary key (venue_name)
);
rooms
(
venue_name,
room_name,
primary key (venue_name, room_name),
foreign key (venue_name) references venues (venue_name)
)
tables
(
venue_name,
room_name,
table_name,
primary key (venue_name, room_name, table_name),
foreign key (venue_name, room_name) references rooms (venue_name, room_name),
unique constraint (venue_name, table_name)
)
(Если вы используете имена для ключей, а ваши таблицы не содержат никакой другой информации, кроме имен, вы можете легко удалить таблицы venues
и rooms
, конечно, сохранить только tables
таблицу, если хотите.)
То же самое с числами:
venues
(
venue_no,
name,
primary key (venue_no)
);
rooms
(
venue_no,
room_no,
name,
primary key (venue_no, room_no),
foreign key (venue_no) references venues (venue_no)
)
tables
(
venue_no,
room_no,
table_no,
name,
primary key (venue_no, room_no, table_no),
foreign key (venue_no, room_no) references rooms (venue_no, room_no),
unique constraint (venue_no, name)
)