数据库设计 - 系统默认项和自定义用户项

001*_*001 5 database database-design

此问题适用于任何数据库表设计,您将拥有相同类型的系统默认项和自定义用户默认值(即用户可以添加自己的自定义项/设置).

以下是发票和付款方式的示例,默认情况下,发票可以包含DueOnReceipt,NET10,NET15,NET30的付款条件(这是所有用户的默认值!)因此您将有两个表"INVOICE"和"PAYMENT_TERM"

INVOICE
Id
...
PaymentTermId



PAYMENT_TERM (System default)
Id
Name
Run Code Online (Sandbox Code Playgroud)

现在,允许用户存储自己的自定义"PaymentTerms"的最佳方法是什么?为什么?(即用户可以使用系统默认付款条款或用户自己创建/添加的自定义付款条件)

选项1)将UserId添加到PaymentTerm,为添加了自定义项并将系统默认用户标识设置为null的用户设置userid.

INVOICE
Id
...
PaymentTermId



PaymentTerm
Id
Name
UserId (System Default, UserId=null)
Run Code Online (Sandbox Code Playgroud)

选项2)向Invoice"IsPaymentTermCustom"添加一个标志并创建一个自定义表"PAYMENT_TERM_CUSTOM"

INVOICE
Id
...
PaymentTermId
PaymentTermCustomId
IsPaymentTermCustom (True for custom, otherwise false for system default)

PaymentTerm
Id
Name

PAYMENT_TERM_CUSTOM
Id
Name
UserId
Run Code Online (Sandbox Code Playgroud)

现在通过SQL查询检查用户是否使用自定义付款条件,如果IsPaymentTermCustom = True,则表示用户使用自定义付款条件,否则为false.

选项3)????

...

Boh*_*ian 7

作为基本规则:

  • 首选添加列以添加表
  • 首选添加行以添加列

一般来说,考虑因素是:

添加表格的效果

  • 需要对应用程序进行大多数更改:您正在支持一种新的"事物"
  • 需要更复杂的SQL:你必须以某种方式加入它
  • 可能需要更改其他表以添加引用新表的外键列
  • 影响性能,因为需要更多I/O来加入和读取新表

请注意,我不是说"永远不要添加表格".只知道成本.

添加列的效果

  • 如果表格很大,添加列可能会很昂贵(可能需要几个小时ALTER TABLE ADD COLUMN才能完成,在此期间表格会被锁定,有效地使您的网站"关闭"),但这是一次性的事情
  • 该项目的成本很低:易于编码/维护
  • 通常只需对应用程序进行微小的更改 - 这是一件事的新方面,而不是一件新事物
  • 性能差异可以忽略不计.不会显着恶化,但可能会更快,具体取决于具体情况(如果新列避免加入或昂贵的计算).

添加行的效果

  • 零:如果您的数据模型只需添加更多行就可以处理您的新业务创意,那么这是最佳选择

(Pedants请不要发表评论,例如"没有'零'影响",或"但仍会有更多的磁盘用于更多行"等 - 我在谈论对DB /项目的实质性影响/码)


要回答这个问题:选项1最好(即在支付选项表中添加一列).
推理基于上述指导原则,这种情况非常适合这些指南.

此外,
我还会在同一个表中存储"标准"付款选项,但是使用NULL用户ID; 这样你只需要在真正有一个时就添加新的付款选项,而不是每个客户即使他们使用标准的付款选项.

这也意味着您的发票表并没有需要改变,这是一件好事-这意味着几乎不影响您的应用程序的一部分.

  • 选项1更好,因为您可以使用单个(且简单的)数据库查询来获取标准和用户特定的付款条件. (2认同)