RDBMS中的正确归一化意味着表的扩散.整数字段可以将正交数据存储为位 – 这可以用作替代附加表,而不牺牲关系完整性?
解决方法
你的问题的答案是“不”.位域牺牲关系完整性,原因很简单,就是数据库中没有相应表的实体.
也就是说,许多数据库通常通过“位”数据类型提供对此的支持. MysqL有更强的支持,使用“set”数据类型.
主要的问题是您不了解集合中的元素 – 全名,何时添加到数据库中等等. (枚举可以解决命名问题的一部分.)另外,集合的大小是有限的.你可能有一个例子,事情是有限的.不过,马特的例子就是强调这里的问题.您可以查看所访问的大陆列表.但是,当您切换到所访问国家时,这种做法必然会有很大的不同,因为国家数量不再适合单一的“单词”.在这方面,您希望您的系统对待大陆与国家有很大不同吗?您希望您的设计决策受到计算机字中32位或64位的限制吗?
最后,你似乎看到表的扩散是一个问题.表的扩散实际上是一个解决方案.关于实体的所有数据都存储在表中,而不是通过系统展开.您可以维护有关实体的实例的信息,例如实例创建时,随着时间的推移如何变化等等.每当有人想要一个大陆时,“大陆”的实体就有可能被使用.
考虑两个不同的开发者决定为大陆开发自己的位面具的系统中会发生什么 – 但是它们使得大陆的顺序不同.使用精心设计的关系数据库(意味着表格定义中明确声明了外键关系),就不会出现这种混淆.