Best way to design this database scenario?

Requirement is to store attachments for different entity types.

Say we have 3 entity types Company , Department and Employee. Each can have multiple attachments (documents).

Which is the best way to handle this?

Solution 1:

Company table

  • CompanyId

Dept table

  • DeptId

Employee table

  • EmployeeId

AttchmentType table

  • TypeId
  • Types (company, dept, employee)

Attachments table

  • AttachmentId
  • TypeId (maps to attachment type)
  • entityId (maps to CompanyId / DeptId / EmployeeId)

Pros: I can add new entity types easily in future

Cons: In this case I can't have foreign key relationship maintained between entities and attachments.

Solution 2:

Company table

  • CompanyId

Dept table

  • DeptId

Employee table

  • EmployeeId

CompanyAttachments table

  • AttachmentId
  • CompanyId (FK)

DeptAttachments table

  • AttachmentId
  • DeptId (FK)

EmployeeAttachments table

  • AttachmentId
  • EmployeeId (FK)

Pros: Foreign key integrity

Cons: In order add new entity I need to have new attachment table separately.

So which is the best way to go with assuming I may need to add new entities in future?


Edit 1:

Thanks for your reply guys.

If I want to go with solution 2, I see that creating new columns in attachments table easier instead of creating new attachment tables for every entity just to map them? что-то вроде

Таблица компаний

  • CompanyId

Таблица Dept

  • DeptId

Таблица сотрудников

  • EmployeeId

Вложения

  • AttachmentId
  • CompanyId (FK)
  • EmployeeId ( FK)
  • DepartmentId (FK)

Я что-то здесь упускаю?

7
задан Cœur 12 August 2017 в 05:39
поделиться

5 ответов

Я бы определенно выбрал решение №2. Ваш единственный профессионал в решении №1 на самом деле не профессионал. Если вы добавляете новую сущность, вам обязательно придется уже добавить новую таблицу для этой сущности, и вы уже будете добавлять или изменять существующий код для ее обработки. Вы должны уметь создавать общие объекты, которые обрабатывают шаблон, чтобы дублированный код не был проблемой.

5
ответ дан 6 December 2019 в 21:08
поделиться

Я голосую за решение 2, потому что таким образом можно надлежащим образом обеспечить ссылочную целостность. Кроме того, вы можете легко (при необходимости) добавлять поля для специальных вложений (например, в EmployeeAttachments может быть битовое поле «PersonalPicture» или подобное)

3
ответ дан 6 December 2019 в 21:08
поделиться

Надеюсь, это не требует пояснений.

attachment_model_v1

2
ответ дан 6 December 2019 в 21:08
поделиться

Я бы выбрал вариант 2.

Что-то вроде этого:

alt text http://img84.imageshack.us/img84/815/dbso.png

2
ответ дан 6 December 2019 в 21:08
поделиться

Другие моменты, которые следует рассмотреть:

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

Кроме того, будет ли вложений много и/или они настолько велики, что вам нужно разместить эти таблицы на отдельном устройстве или в другой системе хранения (т.е. указатели файловой системы)? Управление является проблемой, также как и производительность.

0
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: