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


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

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

Ответы:


10

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

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

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

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


Куда может пойти отношение 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

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


1

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

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

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


1

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

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


1

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

утверждение

Я бы

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

комментарий

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


0

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

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.