给定表 tblProject
。这具有无数的特性。比如宽度,高度等等,有几十种。
我正在添加一个新模块,让您可以为移动设备的项目指定设置。这是一对一的关系,所以所有的移动设置都应该存储在 tblProject 中。然而,列表越来越大,属性之间会有一些歧义(IE,我必须在所有移动字段前加上 MOBILE,这样 Mobile_width 就不会与宽度混淆)。
将移动设置反规范化并存储在另一个表中有多糟糕?或者更好的存储设置的方法?属性变得笨重且难以在表中修改/查找。
最佳答案
我想回应@Alexander Sobolev 的建议并提供我自己的建议。
@Alexander Sobolev 建议 EAV model .这会以最大的灵 active 为代价,但性能差且复杂,因为您需要多次加入才能获取实体的所有值。通常解决这些问题的方法是将所有实体元数据保存在内存中(即 tblProperties
),这样您就不会在运行时加入它。并且,将根表中的值(即 tblProjectProperties
)非规范化为 CLOB(即 XML)。因此,您仅使用值表进行查询和排序,而不是实际检索数据。此外,您通常最终也会按 ID 缓存实际实体,这样您就不必每次都进行反序列化。您遇到的问题是实体及其元数据的缓存失效。总的来说,这是一个非常重要的方法。
我会做的是创建一个单独的表,根据您的数据可能不止一个,带有鉴别器/类型列:
create table properties (
root_id int,
type_id int,
height int
width int
...etc...
)
使 root_id
和 type_id
的组合成为唯一,例如,其中 type_id
代表移动设备 - 假设有一个单独的查找表我的例子。
关于数据库设计,大量参数,非规范化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4992263/