我认为这是非常基本的,但我是新手。我在尝试规范化一个表。一个有多个外键的关系可以是3NF吗?这是3NF:
- TALENTPAYMENT (PAYMENTNUMBER,日期,小计,税,总数,人才,代理号码)
还是需要分解成:
-
TALENTPAYMENT (PAYMENTNUMBER, date, subtotal, tax, total)
-
TALENTPAYMENTID (PAYMENTNUMBER, talentid)
-
TALENTAGENT (TALENTID, agentnumber)
我认为大多数其他答案更倾向于你的例子,而不是你的问题。
直接回答这个问题,是的,一个关系可以在3NF中,即使它有多个外键。3NF的关键(咳)点是去除传递依赖,而不是减少外键的数量。
换句话说,不存在"我有太多外键"这种正常形式。
这不是3NF,但不是因为您的外键。您有一些功能依赖项,其中左侧不是候选键:
subtotal,tax -> total
subtotal,total -> tax
tax,total -> subtotal
减少到3NF的算法会说将你的模式分成:
PAYMENTNUMBER | date | subtotal | tax | talentid | agentnumber
和
subtotal | tax | total
PAYMENTNUMBER | date | subtotal | tax | talentid | agentnumber
而不是存储总数。如果您想在查询中使用它,只需SELECT (subtotal+tax) as total
假设小计和税都是数字类型。
反正也不是3NF,因为total = subtotal + tax(或者反过来;我不太会区分合计和小计。
要在3NF中,您必须没有具有非素数属性的传递函数依赖。消除派生属性(总计或小计),我相信您的解决方案是A OK。
对于这个问题,原来的可能是好的,但对于我提到的问题。
您的三部分模式表明可能存在功能依赖talentid图解agentnumber,在这种情况下,您的关系不能在BCNF (3NF)中,因为talendtid不是关系的键之一。
另一方面,人才/代理关系往往是脆弱的,所以发现相同的人才在不同的时间由不同的代理代表并不奇怪。在这种情况下,你可能需要保留"支付时的人才代理"的记录,并且你的原始方案比三部分方案更好(因为三部分方案的数据更改会更改历史记录)。