Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.12.2018 23:22:40

Какой подход более правильный при проектировании БД

Всем добрый день\вечер\ночь\утро

Ситуация следующая: есть небольшое приложение, которое я разрабатываю для своих нужд на Laravel и возник вопрос по проектированию БД.

В чем суть:

Изначально я создал несколько таблиц:

1) Таблица пользователей
2) Таблица со списком папок и внешним ключом на пользователя-владельца этих папок
3) Таблица с категориями внутри этих папок и ссылкой на айдишник папки, которая содержит категорий
4) Таблица с документами внутри категорий  и ссылкой на айдишник категории, которая содержит документы

Все шло хорошо: с помощью hasMany связи я вытягивал коллекции папок, а с помощью hasManyThrough связей коллекции категорий внутри папок на основе аутентифицированного модели юзера. Но беда началась, когда я попытался вытащить документ по той же hasManyThrough: вытаскивалка сработала, но только для категории с id = 1 (т.к. и аутентифицированный пользователь имел такой айдишник). Документы, которые относились к другим категориям, но должны были принадлежать этому пользователю, остались не у дел. Можно было бы попробовать продолжить работать с такой БД, но подход был бы неконсистентым, как минимум, для модели документов

Немного попытавшись пораскинуть мозгами, я перекрутил схему на следующий лад: создать таблицы сущностей (папки, категории, документы) без внешних ключей, а вместо этого использовать одну таблицу, которая будет состоять, по-сути, из внешних ключей:

внешний ключ на пользователя - внешний ключ на папку - внешний ключ на категорию - внешний ключ на документ

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

Изменено Drezor (22.12.2018 23:25:51)

Не в сети

#2 25.12.2018 14:11:52

Re: Какой подход более правильный при проектировании БД

Я бы, по возможности, не использовал hasManyThrough потому что она не до конца реализована в laravel - с неё нельзя давать ссылки на другие таблицы, кроме тех что изначально были связаны. Через "один ко многим" и "многие ко многим" все неплохо работает.

Не в сети

#3 05.01.2019 01:58:01

Re: Какой подход более правильный при проектировании БД

На сколько я могу судить тут речь даже не о безопасности должна идти а об избыточном использовании связей, а это может привезти к нагрузке бд.
В вашем примере что бы вытянуть нужные данные вам придется использовать чрезмерное количество запросов к бд что бы вытащить нужные данные. Конечно я могу и ошибаться т.к я не знаю как именно будут афишироваться данные пользователю.

Не в сети

Подвал раздела