Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем добрый день\вечер\ночь\утро
Ситуация следующая: есть небольшое приложение, которое я разрабатываю для своих нужд на Laravel и возник вопрос по проектированию БД.
В чем суть:
Изначально я создал несколько таблиц:
1) Таблица пользователей
2) Таблица со списком папок и внешним ключом на пользователя-владельца этих папок
3) Таблица с категориями внутри этих папок и ссылкой на айдишник папки, которая содержит категорий
4) Таблица с документами внутри категорий и ссылкой на айдишник категории, которая содержит документы
Все шло хорошо: с помощью hasMany связи я вытягивал коллекции папок, а с помощью hasManyThrough связей коллекции категорий внутри папок на основе аутентифицированного модели юзера. Но беда началась, когда я попытался вытащить документ по той же hasManyThrough: вытаскивалка сработала, но только для категории с id = 1 (т.к. и аутентифицированный пользователь имел такой айдишник). Документы, которые относились к другим категориям, но должны были принадлежать этому пользователю, остались не у дел. Можно было бы попробовать продолжить работать с такой БД, но подход был бы неконсистентым, как минимум, для модели документов
Немного попытавшись пораскинуть мозгами, я перекрутил схему на следующий лад: создать таблицы сущностей (папки, категории, документы) без внешних ключей, а вместо этого использовать одну таблицу, которая будет состоять, по-сути, из внешних ключей:
внешний ключ на пользователя - внешний ключ на папку - внешний ключ на категорию - внешний ключ на документ
В таком случае, если я ничего не упускаю, должна быть возможность вытягивать любые записи принадлежащие конкретному пользователю основываясь только на айдшинике этого пользователя и при этом, что не мало важно, не нарушать правила нормализации БД в части дублировании информации, т.к. по-сути, дублирующих записей в основных таблицах у меня нет, но есть этакая "справочная таблица" для каждого конкретно взятого пользователя. И в этой ситуации меня волнует вопрос безопасности данных - насколько этот подход безопасен?
Изменено Drezor (22.12.2018 23:25:51)
Не в сети
Я бы, по возможности, не использовал hasManyThrough потому что она не до конца реализована в laravel - с неё нельзя давать ссылки на другие таблицы, кроме тех что изначально были связаны. Через "один ко многим" и "многие ко многим" все неплохо работает.
Не в сети
На сколько я могу судить тут речь даже не о безопасности должна идти а об избыточном использовании связей, а это может привезти к нагрузке бд.
В вашем примере что бы вытянуть нужные данные вам придется использовать чрезмерное количество запросов к бд что бы вытащить нужные данные. Конечно я могу и ошибаться т.к я не знаю как именно будут афишироваться данные пользователю.
Не в сети
Страницы 1