我有三个表,tbl_school
,tbl_courses
和tbl_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_courses
和tbl_branches
之间存在一对多关系,因此我必须创建一个新的关系表,将每个课程记录映射到其各自的分支。
当我的用户想要按城市或地区过滤课程时,将使用此关系表。
我想知道这是正确的做法还是有更好的解决方案?
我计划存储一个JSON的课程分支,这将消除关系表,查询将更容易在JSON字符串中找到城市或区域模式。
我是设计模式的新手,所以请耐心等待我。
答案 0 :(得分:1)
您提供的表格描述有一些错误,需要先纠正,之后我的建议会更有意义。
使用表前缀,尤其是tbl_,
是不正确的。所有表都是tbl_s.
如果您使用前缀,则按主题区域对表进行分组。此外,SQL在引用代码中的任何表时允许表限定符:
`... WHERE table_name.column_name = "something" ...
如果您希望获得有关命名约定的建议,请查看this Answer。
使用单数,因为表名应该引用行(关系),而不是内容(我们知道它包含很多行)。那么所有使用的英语都是table_name有意义的。 (例如,参考我的谓词。)
您有一些不正确或无关的列。给你一个数据模型比解释每个项目更容易。有几个项目需要解释:
school.total_branches
是重复的,因为可以很容易地导出该值(通过分支的COUNT()
)。它打破了规范化规则,并引入了一个更新异常,它可以“不同步”。
course.school_id
不正确,因为每个分支可能会或可能不会教授课程。这个关系是很多分支的1个课程,它应该在你正在考虑的新表中。
通过JSON,如果你的意思是在客户端构建一个数组而不是保持数据库中的关系,那么不,绝对不是。数据和数据关系应该在数据库中实现。出于多种原因,其中最重要的是诚信。接下来,您可以轻松地将其拖入客户端,并将其保留在那里以实现流性能。
您正在考虑的表是一个关联表,一个普通的Relational构造,用于关联(“map”,“link”)两个父表,这里是Courses到Branches。
< / LI>不会阻止数据复制。请参阅密钥是数据模型。
ID
列您未提供行唯一性, Relational Model 要求。如果您不清楚,请阅读this Answer。这是模型。
请查看并发表评论。
我需要确保您理解IDEF1X模型中的符号,这与非标准图表不同:每个小刻度,刻度线和线条都意味着非常具体。如果没有,请到模型右下方的IDEF1X表示法链接。
请仔细检查谓词,他们(a)解释模型,(b)用于验证。这是一个反馈循环。他们有两个独立的好处。
如果您想了解有关谓词的更多信息,以及它们的相关性,请转到this Answer并阅读谓词部分。
如果您希望彻底了解谓词,为了理解数据建模,请考虑数据模型(最新版本链接在答案的顶部)与这些谓词。 IE浏览器。看看你是否通过模型和谓词来理解你以前从未见过的数据库。
我提供的关系密钥提供了关系数据库所需的行唯一性,必须防止重复的数据。请注意,根本不需要ID
列。关系密钥提供:
数据完整性
对数据的关系访问(注意易用性和无限制的连接)
关系速度
无其中的记录归档系统(以ID
列为特征)具有。
列描述:
我已经实施了两个address_lines.
显然,不应该包含city
,因为这是一个单独的列。
我认为area
意味着像自治市或县或学校分支所在的地区。如果它是一个固定的地理行政区域(我的前两个描述符),那么它需要一个正式的结构。如果不是(我的第三个描述符),即。它是松散的,或者(例如)它跨越县,然后一个简单的查找表就足够了。
如果您使用正式的管理区域,那么city
必须进入该结构。
答案 1 :(得分:0)
使用附加表的方法对我来说似乎最简单,最直接。我不会在这里混合使用JSON。