从1NF到3NF的归一化

时间:2018-09-06 05:05:28

标签: database database-normalization

如果我有当前位于1NF中的下表:

enter image description here

我需要将此表分解为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)

由于在一个帐号上有多个客户,因此我难以确定该主表的主键。

我是否需要使用带有帐号和分支ID的复合主键?

我在这里还有什么其他/更好的选择?

3 个答案:

答案 0 :(得分:0)

您可以创建如下结构,

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)

您必须将帐户相关信息保留在一个位置,即帐户表本身中。 另外,对于Account_Customer,您可以添加活动标记或从&到日期,以保持更多与客户和帐户相关的信息

答案 1 :(得分:0)

您提到过,一个帐户有很多客户。您是否还有其他条件,例如一个客户可以拥有多个帐户? 如果是这种情况,则必须设计具有多对多关系的设计。 像

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

答案 2 :(得分:0)

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

鉴于示例数据,看来分支ID,分支名称和BSB都与特定分支相关联,并且每个列都是候选键(可以是“主键”)。

3NF表之一应该是:

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

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

3NF表之一应该是:

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

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

因此,3NF表之一应为:

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

另一个应跟踪与给定帐号关联的客户。同样,显示的表是“所有键”,其中Account NumberBranch ID构成一个外键,而Customer ID是另一个外键。

Account_Customers: Customer ID, Account Number, Branch ID

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

  • 分支:分支ID *,分支名称,BSB
  • 客户:客户ID *,客户名称
  • 帐户:帐户*,分行ID *,帐户类型,帐户余额,帐户类型,帐户名称
  • Account_Customers:客户ID *,帐号*,分支机构ID *
相关问题