Предположим, у меня есть таблица «message», в которой я хочу сохранить все возможные сообщения, поддерживаемые моим приложением. Например, в FB-подобном приложении может быть «мультимедийное сообщение» (например, фото, видео, аудио), «сообщение мультимедийного альбома», «личное сообщение» и т. Д. Один из способов моделирования этого:Дизайн базы данных: FK, которые являются NULL - хорошими или плохими?
Table: message
- messag_id (PK)
- user_id (FK, this is the sender of the message)
- message
TABLE: media_message
- media_message_id (PK, receiver of the message implied by the owner of the media)
- message_id (FK)
TABLE: media_album_message
- media_album_message_id (PK, receiver of the message implied by the owner of the media album)
- message_id (FK)
TABLE: private_message
- private_message_id (PK)
- message_id (FK)
- user_id (FK, receiver of the message)
... etc.
Итак, для каждого типа сообщения мне нужно создать какую-то «таблицу сопоставления».
Would что-то вроде этой работы:
TABLE: message
- message_id (PK)
- receiver_user_id (FK)
- sender_user_id (FK)
- message
- media_album_id (FK, NULL allowed)
- media_id (FK, NULL allowed)
Я думаю, что с этим проектом, я все еще мог обеспечить целостность. Если media_album_id
и media_id
оба являются NULL, то я могу предположить, что это «личное» сообщение (или реализовать некоторую аналогичную логику в прикладном уровне). Нижняя сторона, если это даже нижняя сторона, состоит в том, что всегда будут столбцы, которые не используются. Опять же, возможно, это будет лучше масштабироваться - меньше СОЕДИНЕНИЙ и т. Д.
Мысли?
NULLable FK разрешены и не являются проблемой в необязательно существующих отношениях. –
Ларри, что вы думаете о комментариях dportas? – StackOverflowNewbie