如何设计SaaS数据库

Jos*_*ren 18 database database-design database-schema

我有一个我为卡车公司建立的网络应用程序,我想作为SaaS提供.设计数据库的最佳方法是什么?

我应该为每家公司创建一个新数据库吗?或者我应该使用一个数据库,其中包含具有公司名称前缀的表格?或者我应该在每个表中使用一个数据库,只需在表中添加公司ID字段?或者还有其他方法吗?

Don*_*son 28

面对大约10年前的类似情况,我们选择了每个客户的数据库.我们有数百(不是数千)客户.回顾它是我们做出的最佳决定之一.备份很简单.将单个客户端复制到我们的办公室进行分析很容易(只需进行最后一次备份).扩展很容易(将一个大客户端移动到另一个服务器可以释放压力sql服务器上的资源).joel&jeff在堆栈溢出播客(不是最近的播客)上对此进行了讨论,joel做了同样的事情......每个客户端都有自己的数据库.数据库纯粹主义者经常争论将每个人都集中到一个数据库中,但我永远不会这样做.

-don

  • 你怎么保持这个?如果架构更改会怎样 - 您是否必须更改所有数据库的架构? (3认同)
  • 我应该补充说,数据库本身是为客户端命名的.所有数据库中的表都名称完全相同. (2认同)

Nev*_*uyt 10

我应该为每家公司创建一个新数据库吗?

是的 - 唐迪金森是钱的.但是,请参阅下面的细化.

或者我应该使用一个数据库,其中包含具有公司名称前缀的表格?

老兄不!为客户端更改不同的数据库查询会让你疯狂!此外,您几乎肯定会运行动态SQL(在运行查询之前在代码中更改表名),这会损害性能,因为大多数服务器都喜欢缓存查询计划和中间结果 - 如果表名称不起作用不断变化.

或者我应该在每个表中使用一个数据库,只需在表中添加公司ID字段?

如果您想为您的客户提供某种可扩展的模型,您可能希望这样做.虽然为每个客户配置新数据库为您提供了很大的灵活性,但也涉及成本和复杂性.您必须创建一个新的备份计划,具有处理过期客户的生命周期模型等.

因此,您可能会说"免费试用"和"青铜"客户都被集中到一个数据库中,使用公司ID将它们分开; "silver"用户获得他们自己的数据库(但您仍然在架构中保留customer_id字段,因此您不必在两个级别的客户之间更改查询),并且"gold"客户获得他们自己的数据库服务器.

几年前我在一家SaaS公司做过类似的事情 - 客户通常很乐意在基础设施上升级(阅读:性能和弹性)以及功能.

  • 最后一个选项无法处理“青铜”客户想要升级到“白银”或“黄金”的情况 (3认同)