我知道这听起来有点荒谬,但我怀疑如果我们可以表示两个表之间的关系,两个表的数据是如何相关的,有没有办法表示关系,比如每个注册用户都有一个单独的pagelikes 表。为了更清楚地说明我的疑问,让我这样解释,学生报读了几门类(class),比如c、c++、java或其他。然后,我们可以说:
学生 -(注册)- 类(class)
这意味着学生 x 可以注册 c、c++、java 等类(class),或者类(class)可以由 1 个或多个学生注册。
以同样的方式,我们能否以某种方式表示注册用户 1 为他或她创建了一个 pagelikes_1 表这样的关系?
示例图片: user profile
最佳答案
长话短说
您的问题或多或少是一个必须在 DDL(数据定义语言)与 EAV 之间做出选择的规范情况。 (实体属性值)。
尽可能使用一张表
通常,您会有一张表,它是您正在谈论的所有表的联合。至于招生。
// student [student] is enrolled in [course]
Enrolment(student,course)
PK (student, course)
FK (student) to Student (student)
FK (course) to Course (course)
// user [user] likes page [page]
Likes(user,page)
PK (user, page)
FK (user) to User (user)
没有标准的 ER 方法来指示每个实体实例的表,即每个实体实例的关联集。那是因为对于注册,您通常会有一个喜欢的页表。
约束用户表和关于表的表
有描述数据库本身的“元数据”表。 (详细信息取决于 DBMS。)将有一个表,我将调用 Table,其中有一列我将调用 tablename,每个数据库表都有一行,在 tablename 中保存它的名称。您想要的“关系”,即约束,可以在Table 和User 表之间表达。 (但不一定在特定的 SQL DBMS 中声明。)
不清楚您要记录的关系/约束到底是什么。您可能至少想说,如果存在一个名为 Likes_user 的表,那么它的用户就存在。这不是 ER 图显示的那种“关系”/约束,它是 FK(外键)。大多数(但不是全部)SQL DBMS 不能以声明方式表达这一点。它是 NOT EXISTS(select tablename from Table where tablename like 'Likes_%' except select CONCAT('Likes_', user) as tablename from User)
。
您可以计算用户的表名并将其存储在 User 列 likestablename 中,并声明一个 FK Table (tablename) references User (likestablename)
。 (将 likestablename 声明为计算列,如果您的 DBMS 允许的话。)如果您可以向 Table 添加一个可为 null 的用户列,那么您可以声明“FK Table (user) references User (user)”。但你不能,因为它是一个系统表。您可以声明一个 View ,但 SQL 不允许您在 View 中声明 FK。
您可能还希望每个 User 用户在 Table tablename 中都有一个 tablename。那是
NOT EXISTS(select CONCAT('Likes_', user) as tablename from User except select tablename from Table where tablename like 'Likes_%')
。
如果表表名值就像用户用户值一样,那么您可以改为声明 FK 用户(用户)引用表(表名)。由于它们不同,您可以使用 User tablename 技术来声明一个 FK User (tablename) references Table (tablename)
。
如果您想要这两个约束,那么您希望每个用户在 一些 行之间具有完全一对一(即“一对一对应”)表表。在大多数 SQL DBMS 中以声明方式做到这一点并不容易,即使对于所有 行也是如此,因为它们不允许表之间的双向 FK。通常,您可以通过在同一个表中将它们配对来处理所有行的情况。 (可能涉及 View 。)但是在这里你不能,因为 Table 是一个系统表。
如果您的Likes_
user
表有不同的列,那么它是 DDL 与 EAV
您可能需要在每个表中使用不同的列。那么实际上您可以拥有多个由 DML 和 DDL 管理的 Likes_user 表,这很清楚并且完全使用了 DBMS。但是,如果在这种不同列的情况下,在测试和计算成本之后 DDL 不充分,您可以使用单个表以及多个表和/或空列。这些实现了一种技术“EAV”,否则它是一种反模式,因为您失去了很多 DBMS 功能。
关于database - 有没有办法在 E-R 图中表示元组与表之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551181/