我有两个带连接表的表,以允许多对多关系。
这是一种非常熟悉的设计模式。它指示每个成员可以访问的分支。
随着成员和分支数量的增加,我最终会在成员中复制连接表中的大量数据。成员往往可以访问与其他成员相同的分支组。
所以我正在考虑通过创建一个有效不可变的MemberProfile表来规范化我的数据。而不是为每个成员创建MemberBranch记录,我检查匹配的MemberProfile,如果它已经存在则使用,或者如果不存在则创建一个:
我的想法是,如果我有一百万会员只有一百个访问配置文件,这将为我的数据库节省大量空间。
我很高兴这一切都有效,开发工作值得。
我的问题是“这是一个标准的数据库设计模式,如果是这样,它叫什么?”
编辑:有人指出,这是在压缩数据而非正常化。这是设计背后的意图。
答案 0 :(得分:4)
除非您的多个:许多表始终是特定其他基表的连接,否则一个不规范化。你在这里没有正常化。规范化不会引入新的列名。它只是在不同的基表之间重新排列当前的那些。
您只是在压缩/编码数据。这并不一定有任何好处,因为尽管您的数据库较小,但现在一些查询和更新会更慢。 (你已经报告说在你的情况下这是值得的。)
答案 1 :(得分:2)
我理解你想在这个精确的转换上贴上标签,但不幸的是,还没有很多书讨论数据库设计或重构模式。其中少数人是Martin Fowler的Refactoring Databases,你可能知道他在分析模式方面的工作(他也有一个很棒的blog,值得关注!)。在那本书中,Martin介绍了一系列可以应用于数据库的重构模式,并为常见的数据库转换命名,包括你提供的那个,他称之为拆分表。
拆分表。将现有表垂直拆分(例如按列)到一个或多个表中。
该书中提供的数据库重构目录here。
答案 2 :(得分:1)
您好,我不知道模式名称,但我之前使用过相同的原则。 为了保持良好的性能,请根据配置文件的分支向memberProfile引入校验和,这样就可以轻松快速地查找现有配置文件。
但请记住,校验和不一定是唯一的,如果发生冲突,您仍然需要检查分支,但仅限于共享相同校验和的配置文件。
清理可以是一个计划任务就是在没有用户的情况下删除配置文件。