(отредактировано 6/4)
Я проектирую базу данных, которая содержит следующие таблицы об отелях и их расположении (в контексте этого вопроса, скажем, названия отелей уникальны):
[Hotel]
HotelId PK
HotelName AK
[HotelLocation]
HotelId FK
HotelLocationName
(HotelId
, HotelLocationName
) - это ПК в HotelLocation
. Не может существовать два HotelLocations
в одном и том же Hotel
с одним и тем же HotelLocationName
.
Некоторые примеры данных могут быть:
| Hotelid | HotelName | | HotelId | HotelLocationName |
---------------------------- -------------------------------
| 1 | Holiday Inn(1) | | 1 | Reception |
| 2 | Four Seasons | | 1 | Pool |
| 3 | Holiday Inn(2) | | 2 | Reception |
| 2 | Dinning room |
| 3 | Room 100 |
| 3 | Room 101 |
Требуется, чтобы оба HotelName
и HotelLocationName
доступны для редактирования.
По этой причине в случае таблицы Hotel
я использую сгенерированный неизменяемый HotelId
и сохраняю HotelName
в качестве альтернативного ключа (AK) с уникальным ограничением.
Я мог бы сделать то же самое для таблицы HotelLocation
и изменить ее следующим образом:
[HotelLocation]
HotelLocationId PK
HotelId
HotelLocationName
, где (HotelId
, HotelLocationName
) - АК. Проблема в том, что у меня намного больше таблиц, связанных с ним, где FK-подобие (HotelId
, HotelLocationName
) дает мне прямое отношение к Hotel
, которое я не хочу терять.
Я знаю, что все еще могу использовать FK, похожий на HotelLocation
AK, но проблема с каскадными обновлениями остается.
Я думаю о генерации HotelLocationId
способом, которым я могу иметь (HotelId
, HotelLocationId
) PK, например, принимая MAX(HotelLocationId) + 1
для спецификаций c HotelId
для каждой новой записи, но я бы предпочел альтернативное решение, если оно есть.
Есть ли какой-нибудь общий способ справиться с такой ситуацией?