有没有办法在 E-R 图中表示元组与 table 之间的关系?
Is there a way to represent relationship between a tuple and to a table in E-R diagram?
我知道这听起来有点荒谬,但我怀疑如果我们可以表示两个 table 之间的关系,那么这两个 table 的数据是如何相关的,有没有一种表示关系的方法,例如,每个注册用户都有一个单独的 pagelikes table。为了更清楚地说明我的疑问,让我这样解释,学生报名参加了一些课程,比如c,c++,java或其他。那么,我们可以说:
学生 -(注册)- 课程
这意味着学生 x 可以注册 c、c++、java 或课程可以由 1 个或多个学生注册。
以同样的方式,我们能否以某种方式表示注册用户 1 为他或她创建了 pagelikes_1 table 的关系?
样本图片:
user profile
pagelikes of that user]1
TL;DR
您的问题或多或少是必须在 DDL(数据定义语言)与 EAV(实体属性值)之间做出选择的规范情况。
如果可以就用一个table
通常,您会得到一个 table,它是您正在谈论的所有 table 的并集。至于招生。
// 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 方法来指示每个实体实例的 table,即每个实体实例的关联集。那是因为你通常会有一个喜欢的页面 table,至于注册。
约束用户table和table约table
有 "metadata" table 描述数据库本身。 (详细信息取决于 DBMS。)将有一个 table,我将调用 Table,其中有一列我将调用 tablename,每个数据库都有一行 table,在 tablename 中保留它的名字。您想要的 "relationship",即约束,可以在 Table 和用户 table 之间表达。 (但不一定在特定的 SQL DBMS 中声明。)
不清楚relationship/constraint您要录制的内容。可能你至少想说,如果一个名字像 Likes_user 的 table 存在,那么它的用户就存在。这不是 ER 图显示的那种 "relationship"/约束,它是 FK(外键)。大多数(但不是全部)SQL DBMS 无法以声明方式表达这一点。是NOT EXISTS(select tablename from Table where tablename like 'Likes_%' except select CONCAT('Likes_', user) as tablename from User)
.
您可以计算用户的 tablename 并将其存储在用户列 likestablename 中并声明 FK Table (tablename) references User (likestablename)
。 (如果您的 DBMS 允许,请将 likestablename 声明为计算列。)如果您可以将可为空的用户列添加到 Table,那么您可以声明 'FK Table(用户)引用用户(用户)。但你不能,因为它是一个系统 table。您可以声明视图,但 SQL 不允许您在视图中声明 FK。
您可能还希望每个 User 用户在 Table tablename 中有一个 tablename。那是
NOT EXISTS(select CONCAT('Likes_', user) as tablename from User except select tablename from Table where tablename like 'Likes_%')
.
如果 Table tablename 值就像 User 用户值一样,那么您可以改为声明 FK User(用户)引用 Table (tablename) .由于它们不同,您可以使用 User tablename 技术来声明一个 FK User (tablename) references Table (tablename)
.
如果您想要这两个约束,那么您希望每个用户在 some[=58] 之间具有完全一对一的关系(即“一对一对应”) =] 两行 tables tables。即使对于 所有 行,在大多数 SQL DBMS 中以声明方式做到这一点也不容易,因为它们不允许 table 之间的双向 FK。通常你可以通过在同一个 table 中将它们配对来处理所有行的情况。 (可能涉及视图。)但在这里你不能,因为 Table 是一个系统 table.
如果您的 Likes_
user
table 有不同的列,那么它是 DDL 与 EAV
您可能需要在每个 table 中使用不同的列。那么实际上你可以有多个 Likes_user tables 由 DML 和 DDL 管理,这很清楚并且完全使用了 DBMS。但是,如果在这种不同列的情况下 在测试和成本核算后 DDL 不充分,您可以使用单个 table 和多个 tables and/or空列。这些实现了一种技术 "EAV",否则它是一种反模式,因为您失去了很多 DBMS 功能。
我知道这听起来有点荒谬,但我怀疑如果我们可以表示两个 table 之间的关系,那么这两个 table 的数据是如何相关的,有没有一种表示关系的方法,例如,每个注册用户都有一个单独的 pagelikes table。为了更清楚地说明我的疑问,让我这样解释,学生报名参加了一些课程,比如c,c++,java或其他。那么,我们可以说:
学生 -(注册)- 课程
这意味着学生 x 可以注册 c、c++、java 或课程可以由 1 个或多个学生注册。
以同样的方式,我们能否以某种方式表示注册用户 1 为他或她创建了 pagelikes_1 table 的关系?
样本图片:
user profile
pagelikes of that user]1
TL;DR
您的问题或多或少是必须在 DDL(数据定义语言)与 EAV(实体属性值)之间做出选择的规范情况。
如果可以就用一个table
通常,您会得到一个 table,它是您正在谈论的所有 table 的并集。至于招生。
// 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 方法来指示每个实体实例的 table,即每个实体实例的关联集。那是因为你通常会有一个喜欢的页面 table,至于注册。
约束用户table和table约table
有 "metadata" table 描述数据库本身。 (详细信息取决于 DBMS。)将有一个 table,我将调用 Table,其中有一列我将调用 tablename,每个数据库都有一行 table,在 tablename 中保留它的名字。您想要的 "relationship",即约束,可以在 Table 和用户 table 之间表达。 (但不一定在特定的 SQL DBMS 中声明。)
不清楚relationship/constraint您要录制的内容。可能你至少想说,如果一个名字像 Likes_user 的 table 存在,那么它的用户就存在。这不是 ER 图显示的那种 "relationship"/约束,它是 FK(外键)。大多数(但不是全部)SQL DBMS 无法以声明方式表达这一点。是NOT EXISTS(select tablename from Table where tablename like 'Likes_%' except select CONCAT('Likes_', user) as tablename from User)
.
您可以计算用户的 tablename 并将其存储在用户列 likestablename 中并声明 FK Table (tablename) references User (likestablename)
。 (如果您的 DBMS 允许,请将 likestablename 声明为计算列。)如果您可以将可为空的用户列添加到 Table,那么您可以声明 'FK Table(用户)引用用户(用户)。但你不能,因为它是一个系统 table。您可以声明视图,但 SQL 不允许您在视图中声明 FK。
您可能还希望每个 User 用户在 Table tablename 中有一个 tablename。那是
NOT EXISTS(select CONCAT('Likes_', user) as tablename from User except select tablename from Table where tablename like 'Likes_%')
.
如果 Table tablename 值就像 User 用户值一样,那么您可以改为声明 FK User(用户)引用 Table (tablename) .由于它们不同,您可以使用 User tablename 技术来声明一个 FK User (tablename) references Table (tablename)
.
如果您想要这两个约束,那么您希望每个用户在 some[=58] 之间具有完全一对一的关系(即“一对一对应”) =] 两行 tables tables。即使对于 所有 行,在大多数 SQL DBMS 中以声明方式做到这一点也不容易,因为它们不允许 table 之间的双向 FK。通常你可以通过在同一个 table 中将它们配对来处理所有行的情况。 (可能涉及视图。)但在这里你不能,因为 Table 是一个系统 table.
如果您的 Likes_
user
table 有不同的列,那么它是 DDL 与 EAV
您可能需要在每个 table 中使用不同的列。那么实际上你可以有多个 Likes_user tables 由 DML 和 DDL 管理,这很清楚并且完全使用了 DBMS。但是,如果在这种不同列的情况下 在测试和成本核算后 DDL 不充分,您可以使用单个 table 和多个 tables and/or空列。这些实现了一种技术 "EAV",否则它是一种反模式,因为您失去了很多 DBMS 功能。