这个问题适用于任何数据库表设计,其中您将拥有相同类型的系统默认项和自定义用户默认项(即用户可以添加自己的自定义项/设置)。
这是发票和付款类型的示例,默认情况下,发票的付款条件可以是 DueOnReceipt、NET10、NET15、NET30(这是所有用户的默认设置!)因此您将有两个表“INVOICE”和“PAYMENT_TERM” "
INVOICE
Id
...
PaymentTermId
PAYMENT_TERM (System default)
Id
Name
现在允许用户存储他们自己的自定义“PaymentTerms”的最佳方式是什么?为什么? (即用户可以使用系统默认付款条款或用户自己创建/添加的自定义付款条款)
选项 1)将 UserId 添加到 PaymentTerm,为已添加自定义项目的用户设置 userid,系统默认 userid 设置为 null。
INVOICE
Id
...
PaymentTermId
PaymentTerm
Id
Name
UserId (System Default, UserId=null)
选项 2) 向发票“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
现在通过 SQL 查询检查用户是否正在使用自定义付款条件,如果 IsPaymentTermCustom=True,则表示用户正在使用自定义付款条件,否则为假。
选项 3) ????
...
最佳答案
作为一般规则:
- 更喜欢添加列而不是添加表
- 喜欢添加行而不是添加列
一般来说,考虑因素是:
添加表格的效果
- 需要对应用进行最多的更改:您正在支持一种新的“事物”
- 需要更复杂的 SQL:您必须以某种方式加入它
- 可能需要更改其他 表以添加引用新表的外键列
- 影响性能,因为需要更多的 I/O 来连接和读取新表
请注意,我并不是说“永远不要添加表格”。只知道成本。
添加列的效果
- 如果表很大,添加一列的成本可能很高(
ALTER TABLE ADD COLUMN
可能需要数小时才能完成,在此期间表将被锁定,从而有效地降低您的站点“"), 但这是一次性的事情 - 项目成本低:易于编码/维护
- 通常需要对应用进行最小的更改 - 这是事物的新方面,而不是新事物
- 执行时性能差异可以忽略不计。不会明显变差,但根据情况可能会快很多(如果有新列避免连接或昂贵的计算)。
添加行的效果
- 零:如果您的数据模型只需添加更多行就可以处理您的新业务创意,那是最佳选择
( Nerd 们请不要发表诸如“没有‘零’影响这样的事情”或“但仍然会有更多磁盘用于更多行”等评论——我说的是 Material 对数据库/项目/代码的影响)
要回答这个问题:选项 1 是最好的(即在付款选项表中添加一列)。
推理基于上述准则,这种情况非常适合这些准则。
进一步,
我还将“标准”支付选项存储在相同 表中,但使用NULL
用户标识;这样一来,您只需在确实有一个支付选项时添加新的支付选项,而不是为每个客户添加,即使他们使用标准选项也是如此。
这也意味着您的发票表不需要需要更改,这是一件好事 - 这意味着对您应用的那部分的影响最小。
关于数据库设计——系统默认项和自定义用户项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866570/