Каковы недостатки вставки внешнего ключа «прародителя» в таблицу, чтобы избежать чрезмерных объединений? - PullRequest
2 голосов
/ 14 апреля 2020

Или, точнее, что-то вроде ключа прадеда.

У меня есть мультитенантный веб-сайт, у каждого арендатора может быть много форумов, у каждого форума может быть много тем, у каждой темы может быть много сообщений. , Существует API, в котором арендатор может запрашивать информацию о чем угодно вплоть до одного поста. Но чтобы убедиться, что им разрешено это делать, я мог бы посмотреть на thread_id в posts, затем forum_id в threads, затем tenant_id в forums, и все, чем я был на самом деле после того, как было tenant_id, чтобы проверить, соответствует ли клиент, делающий запрос.

Помещение поля tenant_id по всей цепочке, вероятно, является нарушением некоторой нормальной формы, поскольку это избыточная информация, но удар по производительности для всех этих объединений невозможно игнорировать, и бывают случаи, когда мне не нужна какая-либо из этой объединенной информации, кроме одного столбца. Добавление tenant_id ко всем столбцам также сделает экспорт данных одного арендатора нелепо простым.

Но я не хочу, чтобы полиция баз данных постучалась в мою дверь и забрала меня. Я изучал реляционные БД в колледже с акцентом на минимализм и нормализацию, поэтому преднамеренная денормализация базы данных кажется кощунством. Но место тупо дешево, и хранение еще одного int не сломает банк. Я что-то упускаю здесь очевидное? Просто следите за ссылочной целостностью, и я чувствую, что со мной все будет в порядке?

1 Ответ

1 голос
/ 14 апреля 2020

Если денормализация базы данных путем хранения избыточных данных дает необходимую вам производительность и не может быть достигнута иначе, тогда делайте то, что вам нужно.

Я только предупрежу вас о проблемах:

  1. Потерянное пространство, вероятно, является наименьшей из ваших проблем.

  2. Необходимо синхронизировать различные избыточные внешние ключи. Эта нагрузка ложится либо на ваше приложение, либо (лучше) на базу данных, где вы используете триггеры для обновления всех копий.

  3. Вследствие 2. производительность модификаций данных пострадает .

...