我有一个每月开支管理系统。费用分为两类:一次每月的开支和一天的每日开支.我创建了以下表格:
setupExpenses (ExpenseID, Title, IsDaily)
ExpenseMaster (ExpenseMasterID, Month, EmployeeID)
ExpenseDetails (ExpDetID, ExpenseMasterID, ExpenseID, Date, Amount)
ExpenseDetailsDaily(ID, ExpDetID, Date, Amount)如果isdaily在setupExpenses中是true,那么在第三个表中就有一个条目,否则我在另外两个事务表中有条目。如果有更好的建议,我们将不胜感激。我觉得这个设计不对。
发布于 2013-06-17 13:30:06
在不了解更多业务需求的情况下,在您定义的给定结构下,我可能会使用以下内容:
Expense (Id, DetId, TypeId, Amount, Date, EmployeeId)
ExpenseType (Id, Name)其中Expense.TypeId是ExpenseType.Id的外键约束。ExpenseType可以包含每日或每月开支的行。这是可伸缩的,就好像你需要每周或每年的开支(等等)一样。那么,这种正常化就会受益。Expense.EmployeeId将是您的employee表的外键约束,而Expense.DetId听起来像是对另一个表的外键约束,而我似乎无法从列名中转换它。如果只是每个费用的详细信息,那么没有理由不直接将其放在Expense表中(在费用和费用细节之间提供了1:1的关系)。我可能少了几个专栏,但我相信你会明白的。
发布于 2013-06-17 12:14:28
您可以尝试下面的scehema,这样可以避免一个表和重复的数据
ExpenseMaster (ExpenseMasterID, Month, EmployeeID, IsDaily)
ExpenseDetails (ExpDetID, ExpenseMasterID, Date, Amount)
ExpenseDetailsDaily(ID, ExpDetID, Date, Amount)发布于 2013-06-17 13:00:27
第一个表需要一个更一致的名称。而且,表名通常是单数的。
ExpenseSetup
------------
ExpenseSetupID
Title
ExpenseOccurrence
ExpenseMaster
-------------
ExpenseMasterID
EmployeeID
ExpenseSetupID
ExpenseDetail
-------------
ExpenseDetailID
ExpenseMasterID
ExpenseDate
Amount我不明白为什么每天的开支要放在另一张桌子上。您可以通过连接回ExpenseSetup表来获取开销。
https://dba.stackexchange.com/questions/44670
复制相似问题