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

标签 database database-design

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

这是发票和付款类型的示例,默认情况下,发票的付款条件可以是 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/

相关文章:

mysql - 将 Rails ActiveRecord GROUP 查询从 MySQL 转换为 PostgreSQL

database - codeigniter 图片上传(获取加密名称)

mysql - 添加论坛 : sharing a database or creating a new one?

database - 这个设计是否符合 2NF?

c# - 设计题asp.net c#

sql - 为多个用户使用 SDF 数据库文件

java - 连接和 session 关闭

python - URL : Binary Blob, Unicode 或编码的 Unicode 字符串?

database - 在 Cassandra 中过滤列

mysql - 不同域但相同用户的两个相似应用程序