除了创建关系表之外,是否有更有效的方法来处理多值属性?

时间:2015-04-15 06:12:32

标签: mysql database database-design relational-database multivalue

我有三个表,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之间存在一对多关系,因此我必须创建一个新的关系表,将每个课程记录映射到其各自的分支。

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

我想知道这是正确的做法还是有更好的解决方案?

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

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

2 个答案:

答案 0 :(得分:1)

问题

您提供的表格描述有一些错误,需要先纠正,之后我的建议会更有意义。

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

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

    如果您希望获得有关命名约定的建议,请查看this Answer

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

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

    • school.total_branches是重复的,因为可以很容易地导出该值(通过分支的COUNT())。它打破了规范化规则,并引入了一个更新异常,它可以“不同步”。

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

    • 通过JSON,如果你的意思是在客户端构建一个数组而不是保持数据库中的关系,那么不,绝对不是。数据和数据关系应该在数据库中实现。出于多种原因,其中最重要的是诚信。接下来,您可以轻松地将其拖入客户端,并将其保留在那里以实现流性能。

      您正在考虑的表是一个关联表,一个普通的Relational构造,用于关联(“map”,“link”)两个父表,这里是Courses到Branches。

      < / LI>
  4. 不会阻止数据复制。请参阅密钥是数据模型。

    • ID列您未提供唯一性, Relational Model 要求。如果您不清楚,请阅读this Answer
  5. 解决方案

    这是模型。

    请查看并发表评论。

    1. 我需要确保您理解IDEF1X模型中的符号,这与非标准图表不同:每个小刻度,刻度线和线条都意味着非常具体。如果没有,请到模型右下方的IDEF1X表示法链接。

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

      如果您想了解有关谓词的更多信息,以及它们的相关性,请转到this Answer并阅读谓词部分。

      如果您希望彻底了解谓词,为了理解数据建模,请考虑数据模型(最新版本链接在答案的顶部)与这些谓词。 IE浏览器。看看你是否通过模型和谓词来理解你以前从未见过的数据库。

    3. 我提供的关系密钥提供了关系数据库所需的唯一性,必须防止重复的数据。请注意,根本不需要ID列。关系密钥提供:

      • 数据完整性

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

      • 关系速度

      其中的记录归档系统(以ID列为特征)具有。

    4. 列描述:

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

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

      • 如果您使用正式的管理区域,那么city必须进入该结构。

答案 1 :(得分:0)

使用附加表的方法对我来说似乎最简单,最直接。我不会在这里混合使用JSON。