有没有办法在E-R图表中表示元组和表格之间的关系?

时间:2015-11-05 17:36:08

标签: database entity-relationship rdbms entity-attribute-value database-metadata

我知道这可能听起来有点荒谬,但我怀疑如果我们能够表示两个表之间的关系,两个表的数据如何相关,是否有一种表示关系的方式,每个注册用户都有一个单独的pagelikes表。为了更清楚地表明我的怀疑,让我用这种方式解释,学生报名参加一些课程,比如说c,c ++,java或者其他。然后,我们可以说:

学生 - (enrols for) - 课程

这意味着学生x可以注册c,c ++,java等课程,或者一个或多个学生可以注册课程。

以同样的方式,我们可以,某些方式,代表注册用户1之间的关系是否有为他或她创建的pagelikes_1表格?

样本图片: user profile enter image description here

pagelikes of that user] 1

1 个答案:

答案 0 :(得分:1)

<强> TL; DR
您的问题或多或少是规范情况,其中必须在DDL(数据定义语言)与EAV(实体 - 属性 - 值)之间做出决定。 < / p>

如果可以,请使用一个表

通常,您将拥有一个表,它是您正在讨论的所有表的并集。至于报名。

// 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。)我将调用一个表,其中一个列我将调用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)

您可以在用户列likestablename中计算并存储用户的表名,并声明FK Table (tablename) references User (likestablename)。 (如果您的DBMS允许,则将likestablename声明为计算列。)如果您可以向表中添加可为空的用户列,则可以声明'FK表(用户)引用用户(用户)。但你不能,因为它是一个系统表。您可以声明一个视图,但SQL不允许您在视图中声明FK。

您可能还希望每个用户用户在Table tablename中都有一个表名。那是 NOT EXISTS(select CONCAT('Likes_', user) as tablename from User except select tablename from Table where tablename like 'Likes_%')

如果Table tablename值与User用户值类似,那么您可以改为声明FK用户(用户)引用表(tablename)。由于它们不同,您可以使用User tablename技术来声明FK User (tablename) references Table (tablename)

如果你想要这两个约束,那么你希望每个用户在一些行之间具有精确的1到1(即“1对1对应关系”)表格表。即使对于所有行,在大多数SQL DBMS中以声明方式执行也不容易,因为它们不允许在表之间的两个方向上使用FK。通常,您可以通过在同一个表中将它们配对来处理所有行的情况。 (可能涉及视图。)但是在这里你不能因为Table是一个系统表。

如果您的Likes_ user 表有不同的列,那么它的DDL与EAV

您可能希望每个表中都有不同的列。那么你确实可以拥有由DML和DDL管理的多个Likes_ 用户表,这是明确的并完全使用DBMS。但是,如果在测试和计算成本之后的这个不同列的情况下,DDL不足,则可以使用单个表以及多个表和/或空列。这些实现了一种技术“EAV”,否则它是一种反模式,因为你失去了很多DBMS功能。