在描述我的问题之前,我想先解决一些问题:
- 我是一位经验丰富(虽然不是专家)的数据库设计师。我相信我对关系模型有很好的掌握。
- 我对关系模型的理解不够深入,以至于我确切地知道在每种情况下该做什么。我还在学习。
假设我们每月从一家银行获得一次 Excel 电子表格,但并不总是同一家银行。该电子表格只有六列:银行名称、帐号、账户余额、客户(账户持有人)姓名、客户 SSN 和账户持有人地址。每一行都有一个不同的帐号,并且没有帐号被列在多于一行中。我们希望将此电子表格导入数据库,并在未来的任何时候说:“John Smith 2010 年 10 月 13 日的地址是什么?”
为简单起见,假设每个客户只有一个地址,每个客户可以有零个或多个帐户。稍等片刻,让我们假设我们只需要导入一个 Excel 工作表,这是一个愚蠢的前提,但请耐心等待。如果是这样的话,下面的设计就足够了:
bank
--------
id
name
account
--------
id
bank_id
customer_id
number
balance
customer
--------
id
name
ssn
address
city
state_id
zip
state
--------
id
name
我的其余问题基于您同意该架构是“正确”的前提,因此希望您对此感到满意。
现在,如果我们只进行一次导入就可以了,但我们每个银行每年将进行 12 次导入。以下是我考虑的原因:
bank
--------
id
name
account
--------
id
import_id
bank_id
customer_id
number
balance
customer
--------
id
name
ssn
address
city
state_id
zip
state
--------
id
name
import
--------
id
date
excel_file (blob)
现在每个帐户都与导入相关联,我们可以肯定地说“帐户 12345 来自 2010 年 10 月 13 日的导入 572”。customer
当您查看例如表格时,它可能会变得更加模棱两可。由于表中的行数少于customer
表中的行数account
(因为某些客户有多个帐户),因此我们不会像帐户和导入那样在客户和导入之间建立一对一的关系。我知道没有数据丢失,也没有数据完整性的损失,但它仍然感觉像是某种牺牲。
我的问题是(这可能过于开放):您认为这是存储数据的好方法吗?你会做不同的事吗?
编辑:有一种重要的方式来思考这些你必须注意的实体。不要认为account
随着时间的推移而存在的单一帐户。将 aaccount
视为某个时间点的帐户快照。因此,余额为 100 美元的account
账户 12345 与余额为 150 美元的账户 12345 不同。是的,这两条记录都与现实世界中的同一个银行账户相关联,但我存储的是某个时间点的账户快照。与客户类似(但不相同)的情况。