【问题标题】:relationship between database tables not sharing any foreign key(s) in ERDERD 中不共享任何外键的数据库表之间的关系
【发布时间】:2016-12-17 13:33:29
【问题描述】:

考虑以下数据库表的示例:

用户(id [PK],用户名,...)

评论(id [PK], u_id [FK], ...)

reportedCommentInfo(id [PK]、c_id [FK]、reporting_u_id [FK]、日期、...)

管理员(id [PK],用户名,...)

根据此数据库架构,任何用户都可以发表评论,并可以根据包含辱骂或垃圾邮件的材料报告其他用户 cmets。管理员可以查看用户报告的所有 cmets 列表,并可以删除不符合设定标准的 cmets。

在这种情况下,管理员实际上无权访问任何报告的 cmets,即它们的 ID 不存在于 admin 表中,但管理员可以访问和管理报告的 cmets。那么在创建 ERD 时,它们会是报告评论信息和管理表之间的关系吗?

即基本上我的问题是,在创建 ERD/数据模型时,我们可以在两个没有任何主键/外键关系的表之间创建关系吗?

或者两个表只有在它们之间有主键/外键关系时才能关联。

p.s:我们非常欢迎任何有关改进数据库架构或 ERD 结构方面的建议。

【问题讨论】:

  • 用户是在给定场景下只能发表评论的人,而管理员不能发表评论,他/她只能删除那些将被用户报告的评论。跨度>
  • 在关系中,您是指参照完整性吗?您可以创建一个复合键来保持引用完整性,但看起来 id 是键控的,不是吗?
  • 管理员应该是超级用户。这就是我要改善这种关系的方式。
  • Id 使管理员成为具有凭据的用户。如果您不希望他们成为用户,那么我会通过创建一个用户 ID 和 postid 唯一的复合键来使报告唯一。
  • 是的@yardpenalty id(s) 这里是主键,我已经在我的问题中更新了它。我同意你的建议,管理员应该是超级用户。我的错。

标签: mysql database database-design foreign-keys erd


【解决方案1】:

如果任何管理员都可以查看任何评论,则无需对他们之间的关系进行建模。不要将数据建模与系统建模混淆。数据模型只需要对您想要记录的事实进行建模。如果您想跟踪哪些管理员审查了哪些 cmets,那么您当然可以引入它们之间的关系。但是,您不需要关系来授予管理员用户对所有 cmets 的访问权限。相反,您的应用程序代码可以检查登录用户是否是管理员用户,并根据他们的状态显示不同的按钮或内容。

你问是否“两个表只有在它们之间有主键/外键关系时才能相关”。从关系和实体关系的角度来看,我们不关联表,我们使用表来关联值集。一些集合代表现实世界的事物(如用户),而另一些则代表标签(如名称)或测量值(如日期)。任何两组或多组值都可以通过为此目的创建合适的表来关联。外键约束用于指示一个列(一组值)是另一列(一组值)的子集,而不是关联行。有关此主题的更多信息,我推荐一本书,例如 Lex de Haan 和 Toon Koppelaars 的数据库专业人员应用数学

【讨论】:

  • 所以根据这个概念和当前的数据库模式,admin 表不会与任何其他表有任何关系,但它可以管理 Reportedcmets。那么我是否应该尝试更新我的模式以显示这种关系?或者两个实体在 ERD 中没有任何关系但它们在现实世界中确实有这种关系是可以的?我最近对一个项目的设计图很感兴趣,这就是我所有的概念都混在一起的原因。他们在我的域模型和 DCD 中确实有关系,这就是为什么所有这些混乱的原因。
  • 管理员管理reportedcmets的能力是系统行为,而不是知识,所以它属于你的系统模型,而不是你的数据模型。您的数据模型应该组织系统所需的事实,仅此而已。您的系统模型应该描述系统的行为组件。我将 DBMS 视为这些组件之一,这样我就可以对它与系统其他部分之间的交互进行建模。
  • 另外,我认为 Admin 应该作为 User 的子类型或属性来处理,而不是独立的实体集。管理员应该具有与用户相同的所有信息要求和能力,甚至更多,对吧?
  • 我同意你的观点,我在这里将其分开是为了更好地理解示例并更清楚地说明管理员和用户具有不同的职责。
  • 你能详细说明一下吗? “你的数据模型应该组织系统所需的事实,仅此而已。”我的系统要求管理员控制/管理/审查报告的评论。那么在是/否答案中,我的数据模型是否应该包含此功能?
【解决方案2】:

您似乎对实体-关系模型/图表和关系建模有一些基本的误解。

实体类型/表格有方框图标,关系类型/表格有菱形图标。关系中实体的参与是线/FK。您的图表已经报告了 cmets 和管理员之间的关系和表格:reviews。如果您想要满足不同应用程序关系/关联的行,那么您必须通过查询根据给定/基本关系来表达它,或者您必须添加一个新的给定/基本关系和表。

-- REPORTEDCOMMENTID identifies reporting of comment COMMENTID ...
select * from ReportedCommentInfo

--admin ADMINID has name NAME and ...
select * from Admin   

--   REPORTEDCOMMENTID identifies reporting of comment COMMENTID ...
-- AND admin ADMINID has name NAME and ...
select * from ReportedCommentInfo join Admin    

您不需要行/FK 来查询。他们只是给予/基础参与。 (对 ER 建模调用参与/FK“关系”的错误陈述。)

PS 有桌子,也有工作。表格记录了业务的状态。一项工作涉及读取和/或更新一些相关表格。 ER 图只显示表格。您似乎将 ER 图与数据流图混淆了,后者是关于人们如何使用表来完成工作的。您在架构中拥有的数据的 ER 模型(架构/图表)将具有 User、Admin 和 Comment 实体、关于用户和 cmets 的 Posts 关系以及关于用户和 cmets 的 Reports 关系,可以将其视为报告关联实体。至于变体,包括您的架构,您需要选择一种特定的设计方法并遵循它。另外,你没有给出使用你给出的 ER 图的理由。

【讨论】:

  • 基本上这是我的问题,这两个表之间应该存在关系吗?如果不是,那么我应该更改数据库模式以显示该关系吗?如果我应该更改数据库架构,那么我应该如何更改它。或者 ERD 没有必要显示每个现实世界实体之间的关系。
  • 这意味着管理员将履行其职责,但管理员在ERD中实际上与reportComments没有任何关系吗?所以管理员会单独躺在 ERD 的一边?
  • 必须告诉我们你想在你的数据库中记录什么关系。假设 entities 用户、管理员和评论以及 relationship 帖子都可以。但是你的图表有一个 ReportedCommentInfo 实体......奇怪。 (也许它是某种关系的关联实体?)您声称涉及它们的关系也很奇怪。因此,请编辑您的问题以解释报告的评论信息实体是什么(如果它不是错误)并给出每个关系的 谓词 - 一个由列/实体名称参数化的语句模板 - 就像我一样..
  • 在您的图表中,管理员和报告的评论信息之间存在 关系。你要还是不要?你把它放在那里。您是什么意思,“这意味着管理员将履行职责”?请写清楚。如果你的意思是,菱形表示管理员做什么,不,这不是它在 ER 图中的含义,这种图不是用来说那种东西的。你知道什么是数据流图和什么是 ER 图(带菱形的样式)吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2013-04-13
相关资源
最近更新 更多