哪个更适合长期数据库可扩展性:添加列或具有键/值存储

val*_*nas 5 mysql database-design t-sql scalability eav

对于目前只有很少(5-10)个设置但将来会有更多(最多100个)设置的应用程序,这将是更好的方法:

  1. 每次引入新设置时向设置表添加新列
  2. 将设置表作为键/值存储

考虑到应用程序可能有数百万个实例(它们都在同一个数据库上运行并使用同一个表进行设置),数据库可能被分片。DB 是关系型的,即 MySQL 或 T-SQL。

作为开发人员,我更喜欢第二个变体,因此我可以在不更改数据库架构的情况下扩展应用程序并随意添加/删除设置。据我了解,如果索引聚集在应用程序实例上,那么在单个表中拥有几百万条记录应该不是问题。有什么我不知道的缺点吗?

那么第一个变体呢?有什么大的好处吗?那么列数呢:表可以包含的列数是否有任何理论限制?如果我有一个包含 1000 (10 000, 1000 000) 列的表会发生什么?那会不会很慢?

gbn*_*gbn 6

选项 2 称为“EAV”或实体-属性-值

  • 不是关系
  • 没有数据库级别的限制
  • 除非一个简单的列表,否则需要扭曲来读取数据

但是,这取决于您所说的“设置”是什么意思。如果您有几 1000 行不是对象并且不需要约束,那么,是的,请使用此模式。这就是 SQL Server 对sys.configurations所做的

如果您想拥有一个可以存储任何内容的“灵活模式”,那么就不要. 它会以泪水结束。另请参阅DBA.SE 上的 EAV 问题

请注意,“额外列”(选项 1)允许您定义默认值和数据类型安全,而“缺少行”(选项 2)需要在代码中存储默认值,并且所有内容都是数据库中的字符串

“这取决于”