【发布时间】:2016-04-19 15:21:11
【问题描述】:
所以。我正在构建一个多租户 Laravel SaaS Web 应用程序,在数据库设计方面有点卡住。我一直在四处寻找解决方案,但我真的无法决定选择哪一个。我真的希望你们中的一些比我更有经验和知识的人能提出一些建议。很抱歉这篇文章很长,但我希望你能坚持下去。
问题:
在应用程序中,我的用户将从他们自己的外部数据库(使用已知架构)导入数据。
例如:我将导入具有属性的产品到类别。最简单的方法是将外部 product_id 导入产品的新主键。 但是由于用户 product_id 可能会发生冲突,我必须为每个产品分配一个新的主键,同时在同步回外部数据库时仍保留外部 product_id 以供参考。
例如:外部 product_id 将是 ext_product_id,我将分配一个新的 product_id 作为主键。
到目前为止,我可以想到 3 种方法来做到这一点:
解决方案 1 - 具有新主键的单一数据库:
因此,如果我导入产品和类别列表,我将不得不将每个外部 product_id 保存为 ext_product_id 并为产品分配一个新的主键。然后,我必须查询类别 ext_category_id = products ext_category_id,然后使用新的主键 product_id 和主键 category_id 创建一个新关系。 在导入数千行时,这些循环查询需要很长时间,而且有些表有 4 种不同的关系,这意味着需要跟踪和同步大量“ext_”列。
解决方案 2 - 复合主键:
由于每个用户都不会引用外部数据库,因此我可以创建由 tenant_id 和 e.g. 组成的复合键。外部 product_id。这将允许我批量插入带有由租户组成的键前缀的外部数据。这样,关系应该“开箱即用”。 但据我所知,Laravel 不支持该功能?有什么想法吗?
解决方案 3 - 多个数据库:
为每个租户创建一个单独的数据库可能是最好的解决方案性能和理智(首先),因为我只能复制/批量插入外部数据库,并且关系将立即起作用. 但我真的很担心这种设计的可扩展性:我实际上能够管理多少个数据库?假设我有 1000 甚至 10000 个客户? 如果我想在更新中添加一列怎么办?我可以对所有数据库执行某种循环迁移吗?
我真的希望你们中的一些人可以帮助我继续前进,因为我被困住并且没有解决方案 2 和 3 的经验。
提前致谢!
【问题讨论】:
标签: php mysql database laravel multi-tenant