关于数据库设计的建议 - 涉及关系的多个表

时间:2011-04-02 17:47:43

标签: sql-server database-design model

我的应用程序需要在多个表之间实现一对一的关系。我有一个存储公司的表(可以是客户和供应商,或两者兼而有之)。有两个比特字段,客户和供应商。

然后我有不同的表格用于各种操作:发票,银行操作,Cashdesk操作。我需要将付款与发票配对。付款不是发票的确切金额,但可以在每个发票数量上进行拆分。此外,发票可以分多次付款。付款可以来自银行或现金支付业务

我最初的方法是有一个表,PaymentRelations,外键InvoiceID,BankOpID,CashOpID和Amount,并且对于它们之间的任何支付,我创建一个只填充了两个外国ID的记录,以及相应的金额。这种方式在任何时候我都可以知道每项操作(发票或付款)支付了多少。

还有RI要求,因此如果文档涉及支付关系,则无法删除(或者有级联删除,因此如果删除了发票文档的付款,则删除相关的PaymentRelations记录,因此对应操作被释放 - 它们不再涉及支付关系,因此它们的金额可以充分用于其他支付关系)。

但又出现了另一种情况。由于合作伙伴既可以是客户也可以是供应商,因此可以在同一合作伙伴的客户和供应商方面对相同类型的操作进行补偿(例如,合作伙伴既是客户又是供应商,他作为100的供应商开具发票并收到发票作为150的客户,50在收到的和发送的发票之间得到补偿,其余的通过一个或多个支付操作支付。 对于其他操作也可能发生这种情况(例如,他通过银行操作100支付,他通过另一个银行操作200接收,并且50需要在这两个操作之间得到补偿;同样适用于caskdesk操作)。

你会用什么方法来模拟这种关系?

1 个答案:

答案 0 :(得分:3)

我会购买会计软件而不是写它。有些车轮值得重新发明;这不是其中之一。

但如果你必须的话。 。

Bitfields是识别客户和供应商的错误方式。 This SO answer应该让您了解客户和供应商的问题。

如果我必须设计会计系统,我想我会从电子表格开始。我在那个电子表格中设计了一个交易表,这样我就可以了解某些交易是如何相似的,以及其他交易是如何不同的。在这个阶段,我不会担心NULL,重复组,传递依赖关系或其他任何类似的东西。

在电子表格中开发了一个工作(ish)模型后,我会尝试将其标准化为5NF。