从 1NF 到 3NF 的标准化

Normalisation from 1NF to 3NF

如果我有以下 table 目前在 1NF 中:

我需要将这个table分解成3NF。

然后我会有(如果我错了请纠正我):

Customer(Customer ID-PK, Customer Name)
Branch(Branch ID-PK, Branch Name, BSB)
Account(Account Type-PK, Account Name)

我需要什么帐户详细信息?我在想:

Account Details (Account Number, Customer ID, Branch ID, Account Type, Account Balance)

由于一个帐号有多个客户,所以我不知道该主键的主键是什么table。

我是否需要使用包含帐号和分行 ID 的复合主键?

这里有哪些 other/better 选项?

您可以创建如下结构,

Customer(Customer ID-PK, Customer Name)
Branch(Branch ID-PK, Branch Name, BSB)
Account(Account ID-PK, Account Number, Account Name, Branch ID, Account Type, Account Balance)
Account_Customer ( Account_Customer_id-PK, Account id, Customer ID)

您必须将帐户相关信息保存在一个地方,即帐户 table 本身。 此外,对于 Account_Customer,您可以添加活动标志或从和到日期以保持更多客户和帐户相关

正如您所说,一个帐户有很多客户。您是否还有其他标准,例如一个客户可以拥有多个帐户? 如果是这种情况,那么您必须设计多对多关系。 像

Customer(PK, CustomerName)
Account(PK,AccountId,...)
AccountMapping(PK,(Account.PK/Customer.PK) AS FOR,(Account.PK/Customer.PK) AS TO)

我假设被建模的组织是一家银行。

根据示例数据,Branch ID、Branch Name 和 BSB 似乎都与特定分支相关联,并且每一列都是一个候选键(可能是 'the' 主键)。

其中一个 3NF table 应该是:

Branch:  Branch ID, Branch Name, BSB — Branch ID nominated as PK

每个客户只记录两位数据:客户姓名和他们的客户 ID。由于名称可以重复,我们假设客户 ID 是候选键。

其中一个 3NF table 应该是:

Customer: Customer ID, Customer Name — Customer ID nominated as PK 

鉴于前两个数据行和最后一个数据行都标识a/c 9047 1234,但帐户类型信息不同,因此a/c编号在银行所有分支机构中不是唯一的。根据显示的数据,帐号和 Branch ID 的组合应该是唯一的(因此 PK)。但是,一个给定的帐户可以由多个客户共享——请看前两行数据。

因此,3NF table 之一应该是:

Account: Account Number, Branch ID, Account Type, Account Balance, Account Type, Account Name
— PK(Account Number, Branch ID)

另一个应该跟踪与给定帐号关联的客户。同样,显示的 table 是 'all key',Account NumberBranch ID 形成一个外键,Customer ID 是另一个外键。

Account_Customers: Customer ID, Account Number, Branch ID

所以,我认为您需要 4 tables。主键列标有星号。

  • 分支机构:分支机构 ID*、分支机构名称、BSB
  • 客户:客户 ID*,客户姓名
  • 账户:账户号码*、分行ID*、账户类型、账户余额、账户类型、账户名称
  • Account_Customers:客户编号*,帐号*,分行编号*