【发布时间】:2012-03-22 00:17:42
【问题描述】:
我们想在数据库中存储一个user 表。对于每个用户,都有许多属性,例如年龄、性别、出生日期等。
我们当然可以将这些常用的共享属性建模为 user 表中的列,但是,稍后当我们想要添加新属性时会变得不方便,因为我们必须修改表以添加额外的列,并且这个user 表可能很大。尤其是如果我们有不止一种类型的用户,并且每种用户类型都可能有一些独特的属性,那就更糟了。
或者,我们可以采用更灵活的设计,使用具有以下架构的单独表:
user_id | attribute_id | attribute_name | attribute_value
这样每个用户可能占据几行,每行包含特定属性的数据。这样,我们就不必担心向用户(或用户类型)添加新属性。但是,还有另一个问题:每个属性的数据类型可能彼此不同,例如有些可能是 int,有些可能是 float,有些可能是 string。作为回应,我们可以有另一个表用于将数据类型映射到属性,例如:
attribute_id | data_type
或者,我们可以简单地将所有内容存储为字符串,但不知何故,我认为就所需的空间量而言这是一个坏主意。
因此,在架构的灵活性和架构的复杂性/碎片化之间存在权衡,我想知道哪一个总体上比另一个更有利,或者,如果有第三种更好的方法这样做。
欢迎任何评论/建议!谢谢。
【问题讨论】:
-
如果您在教科书或网络上查找有关数据库规范化的信息,您会找到很多关于这个问题的答案。没有正确的答案,因为每个解决方案都是一种权衡,正如您已经说过的那样。只有您可以回答的问题是关于添加新属性的频率。如果属性是相对静态的并且大部分都在使用中,我会采用您的第一种方法。
-
我已经看到在几个大型数据库项目中实现了“user_id|attribute_id”方法。在每种情况下,开发人员都对其进行了很多思考,并且一开始效果很好。但在投入生产几个月后,性能开始走下坡路。这张桌子成了一个热点。
标签: database database-design relational-database database-schema