database - 表中的功能依赖和多值依赖

标签 database database-design database-normalization functional-dependencies

这是我在数据库书中布置的家庭作业。基本上我应该说出其中哪些是函数依赖关系,哪些是多值依赖关系,比如它是 BCNF 还是 4NF,然后想出一个更好的设计(如果需要,也可以是另一个表),以便表是在 BCNF 和 4NF 中。到目前为止,这是我所知道的(或者至少我认为我知道的):

函数依赖:X决定一个且唯一的Y (X->Y)

多值依赖:X决定多个Y的(x->>Y)

候选键:可以用作主键的唯一列

Primary Key:一个唯一的候选键(选择最好的候选键)

PERSONALTRAINER_SESSION

[列]

培训师, 教练电话, 培训师邮箱, 培训师费, 客户姓氏, 客户名字, 客户电话, 客户邮箱, 培训日期, 训练时间


现在,我知道在确定这些依赖关系时我应该将注意力集中在表提供的列和数据上,而不是一般情况下,但似乎与我没有任何明确的依赖关系。例如,仅采用“培训师”列。 “培训师”可以确定电子邮件或类似的东西,我想……但这不是一个清晰简洁的联系,对吗?

同样在候选键方面.....TrainerEmail、TrainerPhone、ClientEmail 和 ClientPhone 在我看来都是可能的候选键。电话号码和电子邮件在现实生活中都是唯一的,但我想电话号码可能只对某个国家/地区是唯一的,而电子邮件在全局范围内都是唯一的。那么哪个是该表的一个好的主键?

也许我的想法不正确,但家庭作业说要先列出功能和多值依赖项,然后重新配置表,所以我想我在某处遗漏了一些东西。

任何关于如何以正确的方式解决这个问题的想法将不胜感激:D

============================================= ========================== 编辑:好的,我已将此表更改为 3。

培训师

TrainerID、Trainer、TrainerPhone、TrainerEmail、TrainerFee

客户

ClientID、ClientLastName、ClientFirstName、ClientPhone、ClientEmail

培训类(class)

TrainerID(外键)、ClientID(外键)、TrainingDate、TrainingTime

这会更有意义吗?也许使用单个复合键更有意义。

最佳答案

采纳已经提出的一些想法:实际上电子邮件地址是唯一的吗?实际上电话号码是唯一的吗?绝对是是的。实际上,事实总是可以从其他事实中唯一识别出来,这同样适用于培训师、客户和您可能想要记录在数据库中的任何其他内容。[*] 这就是为什么在关系模型中我们将信息表示为由唯一元组组成的关系带 key 。

对于规范化的家庭作业练习,通常不希望学生为键或其他任何东西发明新的属性。重点通常是根据一组依赖关系对给定属性进行规范化综合。

这里真正的问题是您需要在数据库中表示哪些类型的事实(谓词)以及哪些业务规则(依赖项)适用于它们。您的问题不包含该信息 - 只有猜测和假设是可能的。

考虑到这样一个任意的练习,我很想说唯一谨慎的答案是以完整的属性集作为键的单一关系。就这样吧。

[* 为避免疑义:我并不是断言电子邮件和电话号码是供培训师或其他任何人使用的正确 key 。 [

关于database - 表中的功能依赖和多值依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17195574/

相关文章:

search - 如何在cassandra中搜索?

带子查询的 MySql 更新语句

c# - 除非重新启动应用程序,否则 DataGridView 不会更新

.net - 是否需要连续编号?

mysql - 实体关系图冗余 : store, 产品、订单、类别

database - 在数据库列中存储分隔列表真的那么糟糕吗?

angular - 如何规范化 ngrx/store 中的深层嵌套数据?

mysql - magento #1064 - 你的 SQL 语法有错误;

c# - 在数据库列中存储尺寸(连同图像)?

mysql - 在 MySQL 中保存用户首选项的最有效方法是什么?