具有"开放式架构"的数据库 - 好或坏的想法?

Cla*_*diu 19 database schema database-design database-schema

Reddit的联合创始人介绍了他们在向数百万用户扩展时所遇到的问题.这里有摘要.

让我感到惊讶的是第3点:

相反,他们保留了一个Thing Table和一个数据表.Reddit中的所有内容都是一件事:用户,链接,评论,子评价,奖励等.事物保持共同属性,如上/下投票,类型和创建日期.Data表有三列:thing id,key,value.每个属性都有一行.标题,网址,作者,垃圾邮件投票等都有一行.当他们添加新功能时,他们不再需要担心数据库了.他们不必为新事物添加新表或担心升级.

这对我来说似乎是一个可怕的想法,但它似乎已经为Reddit解决了.不过,一般来说这是一个好主意吗?或者Reddit的特点恰好为他们解决了?

wal*_*lyk 16

这是称为数据模型EAV实体属性值.它有它的用途.一个主要的例子是自然稀疏的患者测试数据,因为可能会运行数十万个测试,但通常只有少数患者存在.一张有数十万列的桌子很傻,但是带有EAV的桌子很有意义.


Jer*_*fin 8

大多数真正重要的网站最终在数据库方面使用某种非常简单的东西.这具有快速和可扩展的优点.它的缺点是,您需要自动强制执行数据库的所有关系(通过触发器等),您需要在客户端代码中强制执行.保持一致性是一个痛苦的问题,并且至少在短时间内,您的数据几乎总是至少有一些机会不一致.

对于社交网站来说,这是一个值得妥协的方案.大多数情况下大部分时间的数据都是足够的(例如,如果您收到的某项物品的上票数量实际上是20毫秒时已经发送的话,谁真正关心的话),并且在缩放以支持数量的同时保持成本合理用户很重要.


Tho*_*mas 7

我注意到他们没有提到创建针对该数据的报告的难易程度.在狭窄的环境中使用时,EAV可能是有益的.作为大多数系统的核心部分,当您点击报告时,它将成为一场噩梦.EAV的问题在于,大多数好处都是在项目开始时,大部分的痛苦都在分析和报告的后期,特别是由于严重缺乏数据完整性."不必担心外键"对我来说听起来像是孤儿行的噩梦.添加使用代理键的一切,你有一个纠结的泥沼,通常以完全重写结束