【问题标题】:BCNF and 4NF for Database用于数据库的 BCNF 和 4NF
【发布时间】:2014-03-27 16:57:52
【问题描述】:

所以我从这 3 个表开始,并被告知将它们修改为 BCNF 和 4NF:

PRIVATE_SESSION(培训师、电话、电子邮件、费用、ClientLastName、 ClientFirstName、ClientPhone、ClientEmail、日期、时间)

CLUB_MEMBERSHIP(客户编号、客户姓氏、客户名字、 ClientPhone、ClientEmail、MembershipType、EndingDate、街道、城市、 州,邮编)

CLASS(班级名称、培训师、开始日期、结束日期、费用)

*还建议使用一个新表来跟踪客户、订阅的课程和支付的金额,同时仍将所有内容保留在 BCNF 和 4NF 中

================================================ ===================

所以,我将它们变成了这 7 个表格,以尝试遵守 BCNF 和 4NF。问题是……这甚至是正确的吗?如果每个确定项都是候选键,则满足 BCNF 的定义,看起来就是这样。如果 4NF 不包含我相信的多值依赖项,则它是满意的……我尝试将表分开,这样它们就不会

培训师

ID (primary key),
TrainerLastName,
TrainerFirstName,
TrainerEmail,
TrainerPhone

培训师课程

ID (primary key),
ID (foreign key from CLIENT_INFO.ID)
TrainingStartTime,
TrainingStartDate,
TrainingFee

CLIENT_INFO

ID (primary key),
ClientLastName,
ClientFirstName,
ClientPhone,
ClientEmail,

会员地址

ID (primary key),
ID (foreign key to CLIENT_INFO.ID),
State,
City,
Street,
Zip

会员信息

ID (primary key),
ID (foreign key to CLIENT_INFO.ID),
MembershipType,
MembershipStartDate,
MembershipEndDate

CLUB_CLASS

ID (primary key),
TrainerID (foreign key to  TRAINER.ID),
ClassName,
ClassStartDate,
ClassEndDate,
ClassCost

CLASS_ENROLLMENT

(ClassID, MemberID) composite primary keys
TotalClasses,
TotalPaid

【问题讨论】:

  • 为什么TRAIN_SESSION 包含TrainerFirstNameTrainerLastName? (CLUB_CLASS 也是如此)因此对我来说它看起来不是 2nf。
  • 因为我很傻,把我之前做的复制错了。当然,这只适用于这两个......其他任何事情都是......或者是一个错误而不是
  • 我看不出CLASS_EXPENSE 的意义。首先,原始表不对这些数据进行建模——您是否应该在原始模型中添加新概念?其次,不要直接存储聚合数据(AmountofClassesTaken、TotalAmountPaid),您应该对 Class_Member_Enrollment(ClassID, MemberID) 建模,并将这些记录相加得到总数。
  • 啊,对不起,我忘了补充,我们还应该建议一个新表来跟踪客户、订阅的课程和支付的金额,同时仍将所有内容保留在 BCNF 和 4NF 中。我喜欢复合键的想法:D
  • @user2503165 - 所以我评论的第二部分仍然有效 - 你不是在模拟哪些成员注册了哪些课程。

标签: database database-normalization bcnf


【解决方案1】:

对于建议架构的更新版本(修订版 11)

由于要修改架构,因此很难使答案与架构的当前版本保持同步。请在查看任何给定答案时牢记这一点。

Class Enrollment 包含不合适的 Total Classes 和 Total Paid 字段。除非成员可以与标价(在这种情况下需要“已付费”)属性相比,就该类协商每个类的费用(折扣),否则该表应该是唯一的。应在必要时计算总数,或将其存储在独立于特定类别的单独表格中。

Membership Info 和Member Address 获得了两个名为ID 的列,这很混乱。据推测,第二个应该在每个表中标记为 Client ID(这样会更合理)。现在出现的问题是“会员信息和客户信息之间以及会员地址和客户信息之间的关系的基数是什么?”对于地址,可以在不知道地址的情况下存在成员吗?一个成员可以有两个或多个地址吗?如果其中任何一个的答案是“是”,那么设计是可以的。如果答案为“否”,则不清楚您是否需要客户信息和会员地址。会员信息和客户信息也是如此。

Trainer Session 有两个 ID 字段。第二个可能是客户 ID,但它还需要一个培训师 ID 来识别哪个培训师运行了会话。

对于建议架构的原始版本(修订版 6)

或建议架构的“接近原始”版本。

由于缺少“类名”元素,您显然没有创建非损失分解。

Class Expense 表在原始表中没有对应项。

虽然我同意大多数字段,但尚不清楚 Trainer 表是否可以从原始表中得到保证。不过,费用属性在这里放错了位置。

Train Session 表缺少属性,无论您如何切分事物,都或多或少。如果它旨在代表私人课程,那么您缺少培训师 ID 和客户 ID 和费用。如果它是通用的公共(俱乐部)会话,那么您需要一个记录私人会话的表。

“会员信息”、“客户信息”和“会员信息”三者混淆和/或混淆。如果没有关于数据库应该如何处理信息的补充信息,很难知道什么是最好的推荐。成员信息表最好命名为地址。 Membership Info 表与 Client Info 表没有关联,因此成员资格与地址相关联,但与人员无关(人员与地址无关)。

我认为 Club Class 表还可以。

存在课程并由培训师教授,但从未记录过任何人参加课程。

【讨论】:

  • 我已经返回并进行了一些编辑,尽管很有可能我把一些东西搞砸了。使用不同表(Client_INFO、MEMBER_ADDRESS 和 MEMBER_INFO)的想法是分离一些多值依赖项......但我没有提到的是,为了进行私人教练课程,您必须成为俱乐部的成员,但是它只是一个附加选项。俱乐部设施(又名课程)也需要会员资格,但我将私人课程和设施课程视为不同的东西。
  • 或者换句话说...当一个人注册并成为该俱乐部的会员时,他们有两条途径可供他们使用。他们可以在自己的时间以象征性的费用聘请独立的私人教练(Trainer_Session)......或者他们可以参加俱乐部提供的课程和相同的教练,但需要支付其他费用(Club_class)。
  • 我知道,我真的很抱歉我一直在修改它,但我不希望它占用页面的 10000000000 行。因此,转到 CLIENTINFO 和 MEMBERADDRESS,我将两者分开的原因是因为我认为它会有一个多值依赖项。对于 MEMBERSHIP INFO,我为 MEMBERSHIP INFO 制作一个单独的表格的原因是(在我看来)俱乐部的会员资格在逻辑上与客户的一般数据不相符,即使那里存在间接关系。合并这些表会更好吗?
  • 按照你之前所说的......当然我可以有一个没有地址的人,但这种情况的可能性有多大?好像是创可贴
  • 我理解编辑架构的必要性——但它也确实使回答过程复杂化。引用修订是一种新事物(我以前没有做过,也没有看到其他人做过),但可以帮助后来的人看到我在说什么。 商业:我认为大多数俱乐部可能会坚持提供地址。分开应该 1:1 连接的表(不是 0-or-1:0-or-1 或其他类似的东西)通常只会让生活变得复杂而没有任何好处。 (例外:如果你有一个大列——BLOB 或类似的——那么单独存储它可能会更好,但这是物理设计。)
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多