Каков наилучший дизайн базы данных для этой ситуации?

8

Я работаю над созданием бизнес-приложения для своей компании и пытаюсь выбрать наиболее подходящий дизайн базы данных для конкретной ситуации. Допустим, у меня есть следующие объекты:

утверждение

  • Я бы
  • Положение дел
  • ...

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
  • Комментарий

Я знаю, что это все правильные решения, но я не могу решить, какой из них будет лучшим для добавления различных типов разрешений в будущем. Какие-нибудь мысли?

user1384977
источник

Ответы:

10

Эмпирическое правило, которое я использую, заключается в том, что дизайн базы данных плох, когда приходится менять таблицу, чтобы приспособить изменение кода или новую функцию, если это можно запланировать в будущем.

Тем не менее, я бы использовал вариант варианта 1

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

Теперь при добавлении новых типов объектов, требующих утверждения, вам нужно только вставить строку в ApprovalTypes вместо того, чтобы изменять таблицу для добавления столбца.

sreimer
источник
Куда может пойти отношение id к определенному заказу / счету в этой ситуации? Скажем, заказ требует «одобрения кредита», поэтому тип одобрения будет кредитом, но как он связан с заказом (или каким-либо другим объектом)? Кроме того, куда пойдут дополнительные столбцы, относящиеся только к утверждению кредита?
user1384977
Это добавляет немного сложности. Вы можете иметь таблицу CreditApprovalDetails. Если вам нужно связать утверждения с заказами, вам понадобится таблица соединений, если она не равна 1: 1. Однако без полного понимания вашего заявления я не могу сделать обоснованное предложение.
Шреймер
2

Это зависит от мощности вашей БД и от того, какие вещи вы хотите сохранить, например, вы можете просто сделать Approval_Comment уникальным и установить соотношение 1: 1 между Approval и Approval_Comment, так что вы пропустите создание одной дополнительной таблицы ... I видел это так:

Cardinality:
Approval N ---- 1 Approval_comment.
Approval 1 ----- N Order
Order N ----- 1 Invoice

введите описание изображения здесь

jcho360
источник
1

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

Вторая имеет бесполезные дополнительные таблицы, которые могут указывать на то, что более одного утверждения может принадлежать одному элементу.

Третий содержит много избыточных таблиц и, вероятно, избыточный код для их обработки.

Matzi
источник
1

Если вам нужно выбрать один из трех вариантов, я считаю, что вариант 2 - лучший. @sreimer правильно, что необходимость изменить структуру таблицы для предсказуемых событий указывает на плохой дизайн. Наличие OrderID и InvoiceID в таблице Approvals, на мой взгляд, очень близко к повторяющейся группе по столбцам и нарушает дух, если не букву, первой нормальной формы.

Я хотел бы рассмотреть возможность добавления столбца ApprovalID к каждой таблице, которая нуждается в утверждении. Если значение равно нулю, оно не было утверждено. Если это не вариант, я думаю, что @sreimer на правильном дизайне - некоторые уточнения могут помочь подтвердить это.

mdoyle
источник
1

Я хотел бы предложить вам только одну таблицу =>

утверждение

Я бы

положение дел

комментарий

И имейте одобрение, сохраненное в таблице счетов или заказов. Таким образом, вам не нужно добавлять столбец для каждого объекта, и вам нужно будет поддерживать меньше таблиц. И если мне придется выбирать между предоставленным вами вариантом, я перейду к варианту 2 и добавлю комментарий одобрения в таблицу одобрения.

techExplorer
источник
0

Вы можете попробовать что-то вроде этого:

Сертификаты
---------
  Я БЫ
  положение дел
  approver_name
  (другие вещи)

заказы
------
  Я БЫ
  (другие вещи)

Счета-фактуры
--------
  Я БЫ
  (другие вещи)

approved_objects
----------------
  Я БЫ
  Approval_id (FK - относится к таблице утверждений)
  Approved_object_id (FK - может ссылаться на идентификатор счетов, заказов и т. д.)
  песня_объекта

approved_object_types
---------------------
  Я БЫ
  имя

В approved_objectsтаблице указано, какое утверждение соответствует какому утвержденному объекту. Одобренный объект может быть invoices, ordersили что - то другое. Вы определяете, в какой таблице искать, на основе approved_object_type_id. Это будет гибким, но может сделать отчетность немного сложнее.

FrustratedWithFormsDesigner
источник