Я работаю над созданием бизнес-приложения для своей компании и пытаюсь выбрать наиболее подходящий дизайн базы данных для конкретной ситуации. Допустим, у меня есть следующие объекты:
утверждение
- Я бы
- Положение дел
- ...
ApprovalComment
- Я бы
- ApprovalId
- Комментарий
порядок
- Я бы
- ...
Выставленный счет
- Я бы
- ...
Очевидно, что может быть несколько типов утверждений и несколько объектов, которые требуют утверждений. Что было бы наиболее подходящим из следующих вариантов для разработки таблиц:
ОПЦИЯ 1
Есть одна таблица утверждений с нулевыми внешними ключами:
Сертификаты
- Идентификатор ПК
- Положение дел
- OrderId FK NULL
- InvoiceId FK NULL
ApprovalComments
- Идентификатор ПК
- ApprovalId FK
- Комментарий
В этом случае мне придется добавить столбец для каждого объекта, который нуждается в утверждении
ВАРИАНТ 2
Имейте родительскую таблицу Утверждений с общими полями и дочернюю таблицу для каждого объекта, который нуждается в утверждении:
Сертификаты
- Идентификатор ПК
- Положение дел
ApprovalComments
- Идентификатор ПК
- ApprovalId FK
- Комментарий
OrderApprovals
- ApprovalId PK FK
- OrderId FK
InvoiceApprovals
- ApprovalId PK FK
- InvoiceId FK
ВАРИАНТ 3
Есть таблица утверждений для каждого объекта:
OrderApprovals
- Идентификатор ПК
- OrderId FK
- Положение дел
OrderApprovalComments
- Идентификатор ПК
- OrderApprovalId FK
- Комментарий
InvoiceApprovals
- Идентификатор ПК
- InvoiceId FK
- Положение дел
InvoiceApprovalComments
- Идентификатор ПК
- InvoiceApprovalId FK
- Комментарий
Я знаю, что это все правильные решения, но я не могу решить, какой из них будет лучшим для добавления различных типов разрешений в будущем. Какие-нибудь мысли?
источник
Это зависит от мощности вашей БД и от того, какие вещи вы хотите сохранить, например, вы можете просто сделать Approval_Comment уникальным и установить соотношение 1: 1 между Approval и Approval_Comment, так что вы пропустите создание одной дополнительной таблицы ... I видел это так:
источник
Я голосую за первый вариант. Если вы добавите реквизит одобрения к элементу, вы, вероятно, измените поведение этих элементов, поэтому добавление столбца не является большой проблемой. А также, это лучший способ использовать соединения в запросах.
Вторая имеет бесполезные дополнительные таблицы, которые могут указывать на то, что более одного утверждения может принадлежать одному элементу.
Третий содержит много избыточных таблиц и, вероятно, избыточный код для их обработки.
источник
Если вам нужно выбрать один из трех вариантов, я считаю, что вариант 2 - лучший. @sreimer правильно, что необходимость изменить структуру таблицы для предсказуемых событий указывает на плохой дизайн. Наличие OrderID и InvoiceID в таблице Approvals, на мой взгляд, очень близко к повторяющейся группе по столбцам и нарушает дух, если не букву, первой нормальной формы.
Я хотел бы рассмотреть возможность добавления столбца ApprovalID к каждой таблице, которая нуждается в утверждении. Если значение равно нулю, оно не было утверждено. Если это не вариант, я думаю, что @sreimer на правильном дизайне - некоторые уточнения могут помочь подтвердить это.
источник
Я хотел бы предложить вам только одну таблицу =>
утверждение
Я бы
положение дел
комментарий
И имейте одобрение, сохраненное в таблице счетов или заказов. Таким образом, вам не нужно добавлять столбец для каждого объекта, и вам нужно будет поддерживать меньше таблиц. И если мне придется выбирать между предоставленным вами вариантом, я перейду к варианту 2 и добавлю комментарий одобрения в таблицу одобрения.
источник
Вы можете попробовать что-то вроде этого:
В
approved_objects
таблице указано, какое утверждение соответствует какому утвержденному объекту. Одобренный объект может бытьinvoices
,orders
или что - то другое. Вы определяете, в какой таблице искать, на основеapproved_object_type_id
. Это будет гибким, но может сделать отчетность немного сложнее.источник