除了创建关系 table 之外,还有更有效的方法来处理多值属性吗?

Is there a more efficient way to handle multi-valued attributes other than creating a relationship table?

我有三个 table,tbl_schooltbl_coursestbl_branches

每门课程都可以在一所学校的一个或多个分校教授。

tbl_school 得到了:

id
school_name
total_branches
...

tbl_courses:

id
school_id
course_title
....

tbl_branches:

id
school_id
city
area
address

当我想列出学校的所有分支机构时,这是一个非常简单的 JOIN。

但是,每门课程都会在一个或多个分校或学校的所有分校教授,我需要存储这些信息。由于 tbl_coursestbl_branches 之间存在一对多关系,我将不得不创建一个新关系 table 将每个课程记录映射到它各自的分支。

当我的用户想要按城市或地区过滤课程时,将使用此关系 table。

我想知道这是正确的方法还是有更好的方法来解决我的问题?

我计划存储 JSON 个课程分支,这将消除关系 table 并且查询会更容易在 JSON 字符串中找到城市或区域模式.

我是设计模式的新手,请耐心等待。

你的方法加上额外的 table 对我来说似乎是最简单和最直接的。我不会在其中混合 JSON。

问题

您给出的table描述有一些错误,需要先更正,之后我的建议会更有意义。

  1. table 前缀的使用,尤其是 tbl_, 是不正确的。所有 table 都是 tbl_s. 如果您确实使用了前缀,那就是按主题领域对 table 进行分组。此外,SQL 在引用代码中的任何 table 时允许使用 table 限定符:

    `... WHERE table_name.column_name = "something" ...
    

    如果您需要一些关于命名约定的建议,请查看 this Answer

  2. 使用单数,因为 table 名称应该指的是行(关系),而不是内容(我们知道它包含很多行)。那么所有英文用re table_name就有意义了。 (例如,参考我的谓词。)

  3. 您有一些不正确或无关的列。给你一个数据模型比解释每个项目更容易。有几项确实需要解释:

    • school.total_branches 是重复的,因为该值很容易导出(通过 COUNT() 的分支)。打破了Normalization规则,引入了Update Anomaly,可以得到"out of synch".

    • course.school_id 是不正确的,因为每个分支可能会或可能不会教授课程。这种关系是 1 个课程到许多分支,它应该在您正在考虑的新 table 中。

    • 通过JSON,如果你的意思是在客户端构造一个数组而不是将关系保存在数据库中,那么不,绝对不是.数据和数据的关系应该在数据库中实现。原因有很多,其中最重要的是诚信。之后,您可以轻松地将它拖到客户端中,并将其保留在那里以实现流式性能目的。

      您正在考虑的 table 是一个 Associative Table,一个普通的 Relational 构造来关联 ("map", "link") 两位家长 tables,这里是 Courses to Branches。

  4. 不防止数据重复。指Keys就是数据模型。

    • ID 列不提供 唯一性,而 关系模型 要求。如果您不清楚,请阅读 .

解决方案

这是模型。

请查看和评论。

  1. 我需要确保您理解 IDEF1X 模型中的符号,这与非标准图表不同:每个小缺口、刻度和线都表示非常具体的东西。如果不是,请找到型号右下角的IDEF1X Notation link。

  2. 请仔细检查谓词,它们(a)解释模型,(b)用于验证模型。这是一个反馈回路。他们有两个不同的好处。

    如果您想了解有关谓词的更多信息及其相关性,请转至 并阅读 Predicate 部分。

    如果您想彻底理解谓词,以便理解数据建模,请考虑针对这些谓词的数据模型(最新版本 link 编辑在答案的顶部)。 IE。通过模型加谓词,看看你是否了解你以前从未见过的数据库。

  3. 我给出的关系键提供关系数据库所需的唯一性,重复数据必须被阻止。请注意,根本不需要 ID 列。关系键提供:

    • 数据完整性

    • 对数据的关系访问(注意连接的简便性和无限制)

    • 相关速度

    None 其中有一个记录归档系统(以 ID 列为特征)。

  4. 列描述:

    • 我已经实现了两个 address_lines. 显然,那不应该包括 city 因为那是一个单独的列。

    • 我认为 area 表示自治市镇或县或学校分支机构所在的区域。如果它是一个固定的地理行政区域(我的前两个描述符)那么它需要一个正式的结构。如果不是(我的第三个描述符),即。它是松散的,或者(例如)它跨越多个县,那么一个简单的查找 table 就足够了。

    • 如果您使用正式的行政区域,则 city 必须移入该结构。