【发布时间】:2021-07-13 03:21:33
【问题描述】:
让我们假设一个函数依赖:R(A,B,C,D) & FDs{ A->B, A->C, (B,C)->D }
A 可以识别任何元组。将A定义为主键,我们可以实现A和其他的依赖保持。但是B&C的组合也可以唯一标识D。
CREATE TABLE `test` (
`A` INT NOT NULL ,
`B` VARCHAR(100) NOT NULL ,
`C` VARCHAR(100) NOT NULL ,
`D` VARCHAR(100) NOT NULL,
PRIMARY KEY (`A`)
);
此 SQL 仅包含 A 与其他 SQL 之间的依赖关系。但是这条SQL并没有说B,C也可以唯一标识D。
是否可以在 MySQL 中使用单个表定义 B,C 和 D 之间的依赖关系?
我认为一种方法是使用另一张桌子。 R(A,B,C) & FDs{ A->B, A->C } 一张桌子。 R(B,C,D) & FDs{ (B,C)->D } 的另一张桌子。但是,我想使用一个表。
【问题讨论】:
-
这有效吗:
name = CONCAT(fname, ' ', lname)?如果是这样,那么您不应该存储name。数据库中不允许有冗余信息。 -
@RickJames,是的。
name = CONCAT(fname, ' ', lname)。但是让我们假设name != CONCAT(fname, ' ', lname)这个问题。那么我该怎么做呢? -
@RickJames,我需要知道这一点,因为我在Detection of Functional Dependence 中读到,在功能上依赖于
GROUP BY列的列可以使用 SELECT 进行投影。他们使用连接两个表给出了示例。我想知道我是否可以在一张桌子上做到这一点。 -
还是不清楚。静止图像。 “实现依赖”是什么意思?在 SQL 中声明它? PS SQL 的约束声明能力较差。你的表设计得不好,它不是 2NF,所以很难在 SQL 中进行约束。了解数据库规范化。遵循有关信息建模和数据库设计的教科书,并提出您第一次陷入/不确定的问题。以您在教科书中看到的方式写下 FD。 SQL 语言手册不是设计或语言的教科书。
-
现在看起来很清楚了。 PS Re“我认为一种方法是使用另一张桌子。”那是糟糕的措辞,因为使用 2 个表格并不能回答帖子其余部分提出的问题。 PS 使用名字/姓氏/全名作为 B/C/D 转换为您的原始示例,不仅 BC-> 成立,而且 D->B & D->C 也在这里成立。所以你真的没有解决所有的问题或适当的解决方案。我现在也将发布我的另一个标准评论。你真的应该遵循教科书。
标签: mysql database database-design functional-dependencies