Храните файлы и комментарии для веб-приложения. Дизайн стола - PullRequest
1 голос
/ 03 мая 2011

У меня есть веб-приложение с несколькими сущностями (таблицами). У каждого есть свои страницы CRUD.

Я хотел бы добавить для некоторых возможность добавлять комментарии и прикреплять файлы.

Я думал о двух сценариях.

  1. Одна таблица для всех комментариев / файлов - таблица будет иметь некоторый идентификатор для сущности и конкретной записи.
  2. Для каждой сущности отдельная таблица комментариев / файлов.

Файлы будут храниться на диске в каталоге. В таблице будет указано имя файла и некоторая дополнительная информация.

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

С точки зрения приложения дизайн, имеющий одну уникальную таблицу для всех комментариев, кажется, имеет смысл. В терминах кода приложения это означает, что один и тот же SQL будет повторно использоваться для всех сущностей. Это «классический способ», используемый большинством приложений, который распространяется на те же записи и контроллеры, которые используются для обработки комментариев и вложений для всех объектов.

С точки зрения SQL, второе решение может быть полезно в некоторых базах данных, таких как MySQL, чтобы получить больше Memory Cache преимуществ. Каждый комментарий / присоединение, добавленный в 1-м решении, удаляет из кэша памяти все запросы, влияющие на таблицу комментариев. В отдельных таблицах комментарий к одной сущности не делает недействительными запросы к другим сущностям. Но вам бы также потребовалось больше файловых дескрипторов и больший кеш таблиц ... поэтому, чтобы выбрать это решение, вам нужно решение, основанное на реальном, точном случае, где вы сможете сравнить преимущества в скорости доступа к базе данных. , И когда вы добавите новые сущности, вам наверняка будет скучно решение «каждая сущность, у которого есть комментарий», все можно было бы автоматизировать с помощью первого решения.

1 голос
/ 04 мая 2011

Это компромисс. С таблицей одиночных комментариев вы получаете простую, СУХУЮ (не повторяющуюся) схему, но вы не получаете ограничений внешнего ключа и, следовательно, никакого каскадного удаления. Таким образом, если вы удаляете объект с комментариями, вы также должны помнить об удалении комментариев!

Если вы используете несколько таблиц комментариев , вы получаете ограничения FK и каскадное удаление, но у вас есть «мокрая» схема (вы повторяетесь). Например, каждая таблица комментариев может иметь столбец commentbody. Если вы измените определение этого столбца, вы должны изменить его в каждой таблице комментариев!

Одно интересное решение для схемы DRY-er может включать наследование таблиц (см. http://www.postgresql.org/docs/9.0/interactive/ddl-inherit.html), но, пожалуйста, прочтите раздел 5.8.1. Предостережения, так как есть некоторые "ошибки" в отношении индексации, по крайней мере, в postgres.

В любом случае, спасибо вам за внимательное отношение к дизайну вашей базы данных!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...