Database design 从非规范化关系规范化为3NF

Database design 从非规范化关系规范化为3NF,database-design,normalization,3nf,Database Design,Normalization,3nf,给定 我正试着把这个放到3NF里。我走对了吗 1NF: 2NF 3NF: 感谢您提供任何指导[1]您的数据库没有可传递的函数依赖关系,因此它属于3NF类别 [2] 在Agentdetails表中添加一个唯一的列Agent\u ID [3] 保险组合和保单明细表中的呼叫代理ID [4] 运行报告时,如果您希望显示代理名称,请与代理详细信息表进行适当的联接您的1NF答案跳过1NF并尝试直接转到3NF。因此,在第二个和第三个答案中,你似乎不知所措 1NF不会引入新的关系,除非您有可以为空的嵌套表。它所

给定

我正试着把这个放到3NF里。我走对了吗

1NF:

2NF

3NF:


感谢您提供任何指导

[1]您的数据库没有可传递的函数依赖关系,因此它属于3NF类别

[2] 在Agentdetails表中添加一个唯一的列Agent\u ID

[3] 保险组合和保单明细表中的呼叫代理ID


[4] 运行报告时,如果您希望显示代理名称,请与代理详细信息表进行适当的联接

您的1NF答案跳过1NF并尝试直接转到3NF。因此,在第二个和第三个答案中,你似乎不知所措

1NF不会引入新的关系,除非您有可以为空的嵌套表。它所做的是消除嵌套行。然后,更高的范式分解关系

您的原始架构具有以下形式:

 INSURANCE PORTFOLIO:( agent name ,portfolio id, phonenumber  , number of policies in a portfolio)


agentdetails:(agent name#, agent license number, state of residence,policynumber,number of policies in a portfolio#)

policydetails:(agent name#,policy number#, policy description, annual premium, benefit, beneficiary details)
R = (A, B, C, (D, E, F, (G, H, I, J, K), L), M)
我假设,没有政策,投资组合就不可能存在,没有代理,政策也不可能存在。将其转换为1NF应具有以下形式:

 INSURANCE PORTFOLIO:( agent name ,portfolio id, phonenumber  , number of policies in a portfolio)


agentdetails:(agent name#, agent license number, state of residence,policynumber,number of policies in a portfolio#)

policydetails:(agent name#,policy number#, policy description, annual premium, benefit, beneficiary details)
R = (A, B, C, (D, E, F, (G, H, I, J, K), L), M)
您需要选择合适的主键,以便关系中的每一行都由主键的值唯一标识。在最坏的情况下,所有列的组合都是唯一的,即始终有一个键,但在这种情况下,您应该能够找到一个包含3列或更少列的键,这取决于嵌套级别之间的关联

对于2NF,请查看是否可以在1NF模式中找到任何部分函数依赖项。如果选择的主键只有一列,则关系已在2NF中,您可以向前跳过。如果存在任何部分依赖项,请将它们拆分为单独的关系


对于3NF,请查看是否可以在2NF模式中找到任何可传递的函数依赖项。如果有的话,把它们分开分开,分开关系。

我的大学生活是30多年前的事了,所以如果我有点生疏或者跳过了一些步骤,请原谅。首先,列出所有属性并确定其描述的内容:

R = (A, B, C, D, E, F, G, H, I, J, K, L, M)
现在我们有了新的实体保险公司、代理、保单和福利。现在的问题是,这些属性是否会多次出现?是的,一项政策可能有很多好处,因此有很多细节。每个投资组合可以由许多政策组成。因此,我们对利益和政策进行细分,并将其属性从投资组合中移除:

Attribute               Entity
=========               ======
portfolio id            Portfolio
insurance company name  Insurance Co.
insurance company phone Insurance Co.
agent name              Agent
agent license number    Agent
state of residence      Agent
policy number           Policy
policy description      Policy
annual premium          Policy
benefit                 Benefit
beneficiary details     Benefit
number of policies      Agent
number of policies      Portfolio
不再有多个或非原子属性,所以公文包现在是1nf。现在我们提取出描述投资组合以外的实体的属性。现在的设计如下所示:

Benefit(ID, Benefit, Beneficiary Details)
Policy (ID, Policy Number, Description, Annual Premium)
Portfolio (...)
Benefit (ID, Benefit, Beneficiary Details)
Policy (ID, Policy Number, Description, Annual Premium)
Insurance Co (ID, Name, Phone)
Agent (ID, Name, License No, State of Residence, Number of policies)
Portfolio (ID, InsuranceCoID, AgentID, Number of policies)
投资组合现在是2nf。但其他实体之间存在着关系。我在这里做一些假设,其中一个假设是一个代理人为一家公司工作,而不是像一个代表多家公司的经纪人一样。因此,代理人与保险公司的关系为1-n。代理人最多与一家公司相关,一家公司与零家、一家或多家代理人相关。保单和代理人之间、收益和保单之间似乎存在着相同的关系,假设每个收益专门针对每个保单以及保单和投资组合进行定制。添加这些关系如下所示:

Benefit(ID, Benefit, Beneficiary Details)
Policy (ID, Policy Number, Description, Annual Premium)
Portfolio (...)
Benefit (ID, Benefit, Beneficiary Details)
Policy (ID, Policy Number, Description, Annual Premium)
Insurance Co (ID, Name, Phone)
Agent (ID, Name, License No, State of Residence, Number of policies)
Portfolio (ID, InsuranceCoID, AgentID, Number of policies)
不同的假设会产生不同的结果,但过程是相同的


现在投资组合是3nf。我认为策略和投资组合之间的耦合足够松散,可以定义一个1-n交集表,而不是将投资组合FK作为策略元组的一部分,但这在形式上不是规范化过程的一部分。还有一个问题是直接将政策与公司相关,而不是通过代理或通过代理。这将允许代理从一家公司移动到另一家公司,而无需将所有保单拖到他身上。但它提出了一个问题,即如何处理保单涉及的公司与代理人不同的情况。这些都是有效的设计考虑,我甚至没有提到两个计算字段“策略数”,但就规范化而言,我们似乎已经完成了。我不认为这是最好的,这只是一个例子。

如果提问者没有指定任何FD,你怎么知道没有传递性FD?此外,规范化不会引入代理键。最后,你的回答没有解释任何事情。这里的全部想法是,按照我建议的步骤,当执行步骤[3]时,FD将被删除。如果括号表示嵌套表,并且这样的表可以是空的,那么你需要用一个附加表的键将其拆分。@philipxy感谢你指出这一点。我更新了我的答案。假设R=A pk,B,C其中A->B和A->C和C可以为空,我会将其拆分为R1=A pk,B和R2=A pk,C pk。代理项在哪里,或者您考虑过不同的场景吗?更正的PS:如果没有没有没有嵌套表属性的CK,那么您必须引入代理项。带有CK{a,b}的Eg{,}。或者只是一个属性rel
PPS候选键a和嵌套表属性b并不意味着a->>b或a->>未列出的b。规范化为3NF需要了解各种表中的函数依赖关系。你没有给他们。PS Re 1NF请参见。请解释输入内容。它似乎不是一个关系,因为在出现双括号的地方没有属性名称。另外,请清楚解释双括号的含义。从您的示例中,它们似乎意味着类似于嵌套关系的值,而不是类似于元组的值。请提供一份参考资料,说明0NF和1NF的含义以及如何从中获得1NF设计。这些术语没有固定的含义。除非将多值属性视为关系值属性,并且新的关系变量中有一个不包含该属性的候选键,否则在不引入代理项的情况下,您无法分解多值属性。否则,无法重建输入。因此,您需要证明您确实复制了一个CK,以及您已经分解的多值/关系值属性的属性。请看我对reaanb答案的评论。我没有声称我的答案作为家庭作业问题的答案是可以接受的。我承认在最初的帖子中跳过了步骤。我只是希望OP对规范化过程有一个更清晰的概念性观点。我不明白你为什么提到家庭作业。我的观点是,你的程序在一般情况下不起作用,你也没有证明这是它起作用的案例之一。好吧,也许我只是不理解你的抱怨。如果我在某个地方缺少一个代理键,也许你可以指出它,我会修复它。我在第一条评论中解释说:如果你有一个CK和一个MVA多值属性,而不是CK的一部分,那么你可以从原来的表中删除MVA,并引入第二个表,其中包含CK和MVA元素的一个属性。但是,如果CK和MVA不是不相交的,那么就不能这样做,因为这对将不会重建为原始。在这种情况下,你必须引入一个代理。我不是说这里的情况就是这样。我的意思是,如果你没有介绍一个代理,那么你需要证明事实并非如此。请参见我对reaanb答案的评论中的示例。