У меня есть вопрос «передового опыта» для сценария.
Сценарий:
Несколько объектов в БД, например, Document, BlogPost, Wiki, могут совместно использоваться отдельными лицами. Вместо создания таблицы общего доступа для каждой сущности создается отдельная таблица общего доступа. Вопрос в том, как сопоставить таблицу общего доступа с различными объектами?
У меня есть три варианта, пожалуйста, посоветуйте, какой вариант лучше, и если есть лучший вариант.
Option1:
Создать таблицу Акции как:
SHARES
id (unique)
entityId (non DB enforced FK to DOCUMENTS, WIKIS, POSTS etc.)
entityType
sharedBy
sharedWith
sharedDate
Здесь, entityId будет FK для documentId, wikiId, postId и т. Д. И т. Д., А entityType будет идентифицировать, какой тип entityId.
Это имеет проблемы при моделировании Hibernate при создании сопоставления общего ресурса с сущностью, такого как share.getDocument () или share.getWiki () и т. Д.
Вариант 2:
Создайте общие таблицы, которые содержат только информацию об общем ресурсе, а затем создайте таблицы разрешения, которые связывают общий ресурс с сущностью.
SHARES
id(PK)
sharedBy
sharedWith
sharedDate
shareType (helper field for searches)
SHARES_DOCUMENTS
share_id (unique ID and FK, one to one with SHARES)
document_id (FK to DOCUMENTS)
SHARES_POST
share_id (unique ID and FK, one to one with SHARES)
post_id (FK to POSTS)
more share tables here.
Таким образом, в спящем режиме Share может иметь одно к одному для каждого из типов общих ресурсов (например, share.getDocument (), share.getPost () и shareType будет определять, какие отношения являются «активными»)
Вариант 3
Аналогичен варианту 1, но вместо идентификатора объекта создаются отдельные столбцы
SHARES
id (unique ID)
documentId (FK to DOCUMENTS, nullable)
postId (FK to POSTS, nullable)
wikiId (FK to WIKIS, nullable)
sharedBy
sharedWith
sharedDate
sharedType
Здесь каждый столбец может быть сопоставлен с соответствующим объектом, но они могут иметь значение NULL. sharedType может определить, какие отношения являются «активными».
Таким образом, вопрос в том, какая практика лучше всего, как для базы данных, так и для отображения в спящем режиме (и, в конечном счете, для запросов, в отношении производительности).
Спасибо
М. Скорее