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)????
...
作为基本规则:
一般来说,考虑因素是:
请注意,我不是说"永远不要添加表格".只知道成本.
ALTER TABLE ADD COLUMN才能完成,在此期间表格会被锁定,有效地使您的网站"关闭"),但这是一次性的事情(Pedants请不要发表评论,例如"没有'零'影响",或"但仍会有更多的磁盘用于更多行"等 - 我在谈论对DB /项目的实质性影响/码)
要回答这个问题:选项1最好(即在支付选项表中添加一列).
推理基于上述指导原则,这种情况非常适合这些指南.
此外,
我还会在同一个表中存储"标准"付款选项,但是使用NULL用户ID; 这样你只需要在真正有一个时就添加新的付款选项,而不是每个客户即使他们使用标准的付款选项.
这也意味着您的发票表并没有需要改变,这是一件好事-这意味着几乎不影响您的应用程序的一部分.