Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 从1NF到3NF的归一化_Database_Database Normalization - Fatal编程技术网

Database 从1NF到3NF的归一化

Database 从1NF到3NF的归一化,database,database-normalization,Database,Database Normalization,如果我有下表,当前在1NF中: 我需要将此表分解为3NF 然后我会(如果我错了,请纠正我): 我需要什么帐户详细信息?我的想法是: Account Details (Account Number, Customer ID, Branch ID, Account Type, Account Balance) 由于一个帐号上有多个客户,我一直在思考如何制作这个主表的主键 我是否需要使用带有帐号和分支机构ID的复合主键 我还有什么其他/更好的选择吗?您可以按如下方式创建结构 Customer(Cu

如果我有下表,当前在1NF中:

我需要将此表分解为3NF

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

我需要什么帐户详细信息?我的想法是:

Account Details (Account Number, Customer ID, Branch ID, Account Type, Account Balance)
由于一个帐号上有多个客户,我一直在思考如何制作这个主表的主键

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


我还有什么其他/更好的选择吗?

您可以按如下方式创建结构

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,您可以添加活动标志或开始日期和结束日期,以保持更多与客户和帐户相关的信息

正如您所提到的,一个帐户有多个客户。您是否还有其他标准,例如一个客户可以拥有多个帐户? 如果是这种情况,那么您必须使用多对多关系进行设计。 差不多

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

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

给定示例数据,分支ID、分支名称和BSB似乎都与特定分支关联,并且每列都是候选键(可以是“主键”)

3NF表之一应为:

Branch:  Branch ID, Branch Name, BSB — Branch ID nominated as PK
Customer: Customer ID, Customer Name — Customer ID nominated as PK 
Account: Account Number, Branch ID, Account Type, Account Balance, Account Type, Account Name
— PK(Account Number, Branch ID)
每个客户只记录两位数据:客户名称和客户ID。由于名称可以重复,我们将假定客户ID是候选密钥

3NF表之一应为:

Branch:  Branch ID, Branch Name, BSB — Branch ID nominated as PK
Customer: Customer ID, Customer Name — Customer ID nominated as PK 
Account: Account Number, Branch ID, Account Type, Account Balance, Account Type, Account Name
— PK(Account Number, Branch ID)
鉴于前两个数据行和最后一个数据行都标识了a/c 9047 1234,但账户类型信息不同,因此银行中的所有分行的a/c编号都不是唯一的。根据显示的数据,账号和分行ID的组合应该是唯一的(因此PK也是唯一的)。但是,一个给定的帐户可以由多个客户共享—请看前两行数据

因此,3NF表之一应为:

Branch:  Branch ID, Branch Name, BSB — Branch ID nominated as PK
Customer: Customer ID, Customer Name — Customer ID nominated as PK 
Account: Account Number, Branch ID, Account Type, Account Balance, Account Type, Account Name
— PK(Account Number, Branch ID)
另一个应该跟踪与给定帐号关联的客户。同样,所示的表是“所有键”,其中
账号
分行ID
构成一个外键,
客户ID
是另一个外键

Account_Customers: Customer ID, Account Number, Branch ID
所以,我想你需要4张桌子。主键列用星号标记

  • 分支机构:分支机构ID*,分支机构名称,BSB
  • 客户:客户ID*,客户名称
  • 账户:账号*、分行ID*、账户类型、账户余额、账户类型、账户名称
  • 账户\客户:客户ID*、账号*、分行ID*

为什么不将Account和AccountDetails表合并在一起?您需要将大部分“Account Details”放入“Account”表中,但您需要一个表来将客户ID与帐号关联起来。请注意,绿巨人的账号与铁人和洛基的账号相同,但分支编号不同。因此,您需要重新考虑“帐户与帐户详细信息合并”的主键。您好。那么,你的教科书上说了什么,你能做什么,你被困在哪里?你的FDs是什么?这篇文章没有反映出任何证据表明你遵循给定的步骤来解决这个问题。所以答案基本上是重复你的课本&做你的家庭作业。请阅读并点击谷歌的“stackexchange家庭作业”。请仅为方便补充文本和/或为文本中无法给出的内容使用图像。请注意,账号9047 1234出现在两个分支机构中,具有不同的账户类型,等等。因此,账号加上分支机构ID(或者BSB)在
账户的主键中需要,并且您也必须担心账户/客户表中的主键。我怀疑不同分支机构之间是否重复了账号,因为我可以看到同一账号9047 1234有两种账户类型。我认为这完全取决于业务逻辑,这里没有解释。我们是否同意前两条数据线和最后一条数据线具有相同的账号,但不同的分行信息、不同的客户信息以及不同的账户类型和余额信息?如果没有,我们就有大问题。假设我们同意这一点,那么我的解释是,账户号码在“银行”(其数据正在建模的组织)中不是唯一的——但是,根据所示数据,“分行ID”和“账户号码”的组合在整个银行中是唯一的。帐户的唯一密钥可能有其他标准;这个很简单。根据我在这里的理解,AccountNumber不足以唯一标识帐户。我不得不将其与BSB或BranchID结合,但这仍然存在一个帐户有多个持有人(客户)的问题。使用AccountNumber、BranchID和CustomerID的复合PK可以吗?我认为不应该使用复合PK,而应该使用帐户和帐户客户链接的代理键,以便您可以根据帐户编号和分支ID区分每个帐户记录。该表是我得到的所有内容,我被要求将其制作成3NF。我们被期望使用所给的知识和常识。只要我清楚地陈述,我就可以做出假设。