mysql - 每个客户的SQLite3数据库

标签 mysql database sqlite rest database-design

脚本:
在带有symfony2的restful后端和angularjs的前端构建商业应用程序
这个应用程序永远不会被很多客户使用(如果我能卖出100台那就太棒了)。希望更多,但无论如何都是巨大的)
我希望数据库有一个多租户结构,每个客户有一个模式(它们为客户存储敏感信息)
我知道更新模式时会出现问题,但我必须接受它。
今天我有一个mysql演示数据库,每次新客户购买应用程序时我都会克隆它。
我的客户之间没有关系,因此我不需要与多个碎片通信来进行任何查询
对于一个客户来说,他们可以同时使用来自多个设备的应用程序,但是数据库中不会有大量的写操作
我的问题
尝试为后端api设置一些功能测试,我读到有一个专门的sqlite数据库用于加载测试数据,这似乎是个好主意。
不过,我想知道从mysql切换到sqlite3数据库作为我对应用程序的主要数据库支持是否也是一个好主意,以及每个客户机有一个专用的sqlite3数据库是否是一种常见做法。我从未使用过sqlite,我不知道更新模式和复制所有数据库中的更改的过程是否以与其他rdbms相同的方式完成。
对于sqlite,这是一个正确的场景吗?
关于如何实现这一点有什么建议吗?

最佳答案

[我想知道]每个客户机有一个专用的sqlite3数据库是否是一种常见的做法
只有当数据库和应用程序一起部署时,比如在电话上。否则我从来没听说过这样的事。
我从未使用过sqlite,我不知道更新模式和复制所有数据库中的更改的过程是否以与其他rdbms相同的方式完成。
sqlite是一个sql数据库,响应ALTER TABLE等。至于更新所有模式,则必须重新运行所有模式的更新。
模式同步通常由外部实用程序处理,通常orm会有一些东西。有些是服务器无关的,有些只支持特定的服务器。还有专用的数据库更改管理工具,如Sqitch
不过,我想知道从mysql切换到sqlite3数据库作为我对应用程序的主要数据库支持是否也是一个好主意,并且
sqlite的主要优点是不需要安装和运行服务器。这对于快速项目或部署数据库(如电话应用程序)很有意义。对于基于服务器的应用程序,使用数据库服务器没有问题。sqlite的一组非常有限的sql特性成为一个缺点。除了最简单的查询之外,它可能比服务器数据库运行得慢。
尝试为后端api设置一些功能测试,我读到有一个专门的sqlite数据库用于加载测试数据,这似乎是个好主意。
在任何情况下,都不应使用与生产数据库不同的数据库进行测试。数据库实现sql的方式不尽相同,mysql在这方面尤其糟糕,而且您的测试也不能反映实际情况。运行一个mysql实例进行测试并不是很多工作。
这有三个优点…
可扩展性(您可以随时添加字段)
安全性(查询不能意外地显示错误租户的数据)
并行扩展(可以将每个架构拆分到不同的服务器上)
他们的提议相当于为每个租户提供一个单独的、定制的代码副本。你不会那么做的,这显然是一个维护噩梦。代码至少具有分支和合并的版本控制系统的优势。我只知道一个支持分支的数据库管理工具,separate schema thing
假设您已经对租户5的模式进行了自定义更改。现在您有了一个通用的模式更改,您希望将其应用于所有模式。如果更改为5与此冲突怎么办?如果更改为5需要与其他人不同的特殊数据迁移,该怎么办?现在让我们假设您已经对十个模式进行了自定义更改。一百。一千?噩梦。
不同的模式需要不同的查询。应用程序必须知道每个租户使用的是哪个模式,必须有某种类型的模式版本映射需要维护。应用程序代码中必须维护每个可能模式的每个可能查询。噩梦。
是的,将每个租户放在一个单独的模式中更安全,但这只能防止编写错误的查询或包含查询生成器(无论如何这是个坏主意)。有更好的方法可以缓解这个问题,比如文档中建议的Sqitch。攻击者还有许多其他方法可以访问租户数据,但这些方法无法解决:获得数据库连接、访问文件系统、嗅探网络流量。我不认为小小的安全收益值得做维护噩梦。
至于比例,这篇文章已经过时十年了。有很多更好的方法来实现并行伸缩,然后将模式粗略地放在不同的服务器上。整个数据库都致力于这个想法。幸运的是,你不需要这些!在拥有数万到数百万租户之前,扩展对您来说不是问题。对于一个假设的大型并行伸缩问题,用模式维护噩梦来预先加载您的设计的想法是,本末倒置,它已经在酒吧里喝了一品脱了。
如果你想使用关系数据库,我建议你使用postgresql。它有一个非常丰富的sql实现,它的速度和可伸缩性都很好,而且它有一些东西使分离模式的整个想法变得毫无意义:aview filter。这可以用来实现本文中提到的“可扩展性”。每个表都可以有一个meta列,使用JSON类型,您可以随意向其中抛出任何额外的数据。应用程序不需要特殊查询,meta列始终存在。postgresql的json操作符使处理元数据变得非常简单和高效。
您还可以查看built in JSON type。有很多可供选择,许多支持自定义模式和并行扩展。但是,您可能需要更改您对框架的选择,以使用支持nosql的框架。

关于mysql - 每个客户的SQLite3数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067354/

相关文章:

database - 如何将 CodeIgniter 用户密码移动到 Laravel

database - 测验项目的 Postgresql DB 设计

android - 为什么游标永远不会为空?

c# - 使用 Contains 在 SQLite 中搜索非英文文本会返回比预期更多的结果

java - 如何在 sqlite 数据库表中使用 JAVA 代码插入值?

mysql - Symfony - 如何将初始数据加载到数据库

mysql - 使用动态 MySQL 创建新表

php - 使用端口 3307 连接到 MySql

mysql - 将此 INNER JOIN 转换为 UNION

javascript - 将随机数填充到新列/我们只在迁移 :generate sequelize 后添加列