在这种情况下最佳的数据库设计是什么?


8

我正在为我的公司构建业务应用程序,并努力为特定情况选择最合适的数据库设计。假设我有以下实体:

批准书

  • ID
  • 状态
  • ...

批准评论

  • ID
  • ApprovalId
  • 评论

订购

  • ID
  • ...

发票

  • ID
  • ...

显然,可能存在多种类型的批准和多个需要批准的对象。设计表时,以下选项中最合适的是:

选项1

有一个带有空外键的批准表:

批准书

  • 编号PK
  • 状态
  • OrderId FK NULL
  • InvoiceId FK NULL

批准意见

  • 编号PK
  • ApprovalId FK
  • 评论

在这种情况下,我必须为每个需要批准的对象添加一列

选项2

有一个带有公共字段的父审批表,以及每个需要审批的对象的子表:

批准书

  • 编号PK
  • 状态

批准意见

  • 编号PK
  • ApprovalId FK
  • 评论

订单批准

  • ApprovalId PK FK
  • OrderId FK

发票审批

  • ApprovalId PK FK
  • InvoiceId FK

选项3

每个对象都有一个批准表:

订单批准

  • 编号PK
  • OrderId FK
  • 状态

订单批准评论

  • 编号PK
  • OrderApprovalId FK
  • 评论

发票审批

  • 编号PK
  • InvoiceId FK
  • 状态

发票审批注释

  • 编号PK
  • InvoiceApprovalId FK
  • 评论

我知道这些都是有效的解决方案,但是我无法确定哪种解决方案将来最好添加不同类型的批准。有什么想法吗?

Answers:


10

我使用的经验法则是,如果将来可以计划更改表以适应代码更改或新功能,则这是不好的数据库设计。

也就是说,我将使用选项1的变体

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

现在,当添加需要批准的新类型的对象时,您只需要在ApprovalTypes中插入一行,而无需更改表来添加列。


在这种情况下,与特定订单/发票的id关系会去哪里?假设某个订单需要“信用批准”,那么批准类型将是信用,但是它如何链接到该订单(或任何实体)?此外,仅针对信用审批的其他列会放在何处?
user1384977 2012年

这增加了一些复杂性。您可能有一个CreditApprovalDetails表。如果需要将批准链接到订单,则需要一个联接表,除非它是1:1。但是,如果不完全了解您的应用程序,就无法提出明智的建议。
sreimer,2012年

2

这取决于数据库的基数,以及要存储的内容,例如,您可以像一个唯一的一样使Approval_Comment并使Approval和Approval_comment之间形成1-1关系,因此您将跳过创建一个额外的表的过程。这样看:

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

在此处输入图片说明


1

我投票赞成第一种选择。如果将批准条件添加到项目中,则可以适当地更改那些项目的行为,因此添加列并不是大问题。而且,这也是在查询中使用联接的最佳方法。

第二个表具有无用的附加表,这可能表明一个项目可能涉及一个以上的批准。

第三个包含很多冗余表,可能还有冗余代码来处理它们。


1

如果您必须在三个选项之一之间做出选择,我相信选项2是最好的。@sreimer是正确的,因为必须为可预见的事件更改表结构,这表明设计不正确。如我所见,在Approvals表中具有OrderID和InvoiceID的情况与跨列的重复组非常接近,并且违反了第一种普通形式的精神(如果不是字母的话)。

我会考虑向每个需要批准的表中添加一个ApprovalID列。如果该值为null,则尚未被批准。如果这不是一个选择,我认为@sreimer可以用于正确的设计-进行一些澄清可能会帮助确定这一点。


1

我建议您只有一张桌子=>

批准书

ID

状态

评论

并把rovingId存储在inovice或Order表中。这样,您不必为每个对象添加列,并且维护的表也更少。如果我必须在您提供的选项之间进行选择,我将选择选项2,然后将批准注释合并到批准表中。


0

您可以尝试这样的事情:

批准书
---------
  ID
  状态
  approver_name
  (其他的东西)

命令
------
  ID
  (其他的东西)

发票
--------
  ID
  (其他的东西)

批准对象
----------------
  ID
  Approval_id(FK-参考批准表)
  allowed_object_id(FK-可以引用发票,订单等的ID。)
  allowed_object_type_id(FK指核准的对象类型)

批准的对象类型
---------------------
  ID
  名称

approved_objects表告诉您哪个批准与哪个批准的对象一起进行。经批准的对象可能是invoicesorders或别的东西。您可以根据确定要在哪个表中查找approved_object_type_id。这将很灵活,但是可能使报告有些棘手。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.