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

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

我知道这听起来有点荒谬,但我怀疑如果我们可以表示两个表之间的关系,两个表的数据是如何相关的,有没有办法表示关系,比如每个注册用户都有一个单独的pagelikes 表。为了更清楚地说明我的疑问,让我这样解释,学生报读了几门类(class),比如c、c++、java或其他。然后,我们可以说:

学生 -(注册)- 类(class)

这意味着学生 x 可以注册 c、c++、java 等类(class),或者类(class)可以由 1 个或多个学生注册。

以同样的方式,我们能否以某种方式表示注册用户 1 为他或她创建了一个 pagelikes_1 表这样的关系?

示例图片: user profile enter image description here

pagelikes of that user ] 1

最佳答案

长话短说
您的问题或多或少是一个必须在 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/

相关文章:

sql - 帮助我将 Oracle 术语转化为 SQL Server 术语

mysql - 创建与多个表的关系

ruby - 保护 Sinatra 应用程序的最佳实践是什么?

entity-framework - 如何在 Entity Framework (.Net 4.0) 中使用导航属性作为主键?

sql - 何时在 RDBMS 中使用三元关系而不是聚合?

MySQL加入?这些是什么?什么时候使用它们?

mysql - 带有嵌入式选择查询的 MySQL 触发器中的死锁

java - 如何在 Java 中将多个复选框值插入到单列数据库中

java - 具有数千万用户的现实社交网络模型。我应该使用哪些技术?

database - 什么是数据库用户的好名字?