从 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 Number
和 Branch ID
形成一个外键,Customer ID
是另一个外键。
Account_Customers: Customer ID, Account Number, Branch ID
所以,我认为您需要 4 tables。主键列标有星号。
- 分支机构:分支机构 ID*、分支机构名称、BSB
- 客户:客户 ID*,客户姓名
- 账户:账户号码*、分行ID*、账户类型、账户余额、账户类型、账户名称
- Account_Customers:客户编号*,帐号*,分行编号*
如果我有以下 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 Number
和 Branch ID
形成一个外键,Customer ID
是另一个外键。
Account_Customers: Customer ID, Account Number, Branch ID
所以,我认为您需要 4 tables。主键列标有星号。
- 分支机构:分支机构 ID*、分支机构名称、BSB
- 客户:客户 ID*,客户姓名
- 账户:账户号码*、分行ID*、账户类型、账户余额、账户类型、账户名称
- Account_Customers:客户编号*,帐号*,分行编号*