Java 数据库设计决策

Java 数据库设计决策,java,mysql,database,spring,jpa,Java,Mysql,Database,Spring,Jpa,我要设计一个商业应用程序。商户在系统中注册后,他们将能够添加他们的产品、折扣、价格等,并且有智能移动应用程序访问每个商户及其产品 所以对于数据库希望使用MySQL设计,我有三个选择 使用一个数据库并使用单表结构来维护包含名为merchant_id列的目录。 使用一个数据库,为每个商户创建相同的表结构,表名中有唯一的前缀。 在每个商户向系统注册时,使用具有表结构的单独数据库。在这种情况下,将维护一个主数据库,以保存商户的数据库信息。 我们正在开发一个单一的应用程序,以满足所有商户和客户的请求,并且

我要设计一个商业应用程序。商户在系统中注册后,他们将能够添加他们的产品、折扣、价格等,并且有智能移动应用程序访问每个商户及其产品

所以对于数据库希望使用MySQL设计,我有三个选择

使用一个数据库并使用单表结构来维护包含名为merchant_id列的目录。 使用一个数据库,为每个商户创建相同的表结构,表名中有唯一的前缀。 在每个商户向系统注册时,使用具有表结构的单独数据库。在这种情况下,将维护一个主数据库,以保存商户的数据库信息。 我们正在开发一个单一的应用程序,以满足所有商户和客户的请求,并且将有许多商户和客户与系统交互

目前,我们计划使用SpringMVC和SpringDataJPA


因此,我很难在可扩展性和可维护性等方面做出正确的决定。非常感谢您的专业意见/建议。

在我看来,选项1是一条可行之路。我看到的好处是,您可以使用聚合查询来处理此表,以对每个商户执行计算,例如,您的管理员视图希望看到上传产品数量最多的前20个商户

您可能会在选项1中看到的缺点是该表将非常庞大。这可以通过分区技术和正确选择的索引来解决

选项2和3并不好,因为它们在模式中引入了冗余

您也可以考虑使用JPA,您的实体类自然地映射到表,但我认为每个商家的表前缀将很难用JPA破解。这也是选项1的+1

您认为选项2和选项3有哪些好处?我看不出有什么好处,只有缺点

1使用一个数据库,使用单表结构来维护目录 具有名为merchant_id的列

这是最容易走的路线

专业人士

低维护。对数据库的任何更改都将使其成为一个模式/数据库。 缺点

在数据库上每秒扩展不超过X个商户和N个事务。 2使用一个数据库,并为每个商户创建相同的表结构 表名中具有唯一前缀

这是一个混合的排序模型,编写SQL并尝试跟踪哪个前缀属于哪个应用程序,如果处理不正确,可能会很混乱

专业人士

可以扩展得更好一点吗 缺点

每个工作台的维护开销;例如,向表user添加名为created的新列需要修改user_111和user_121等 您可能会尝试将用户_111与访问权_121连接起来,从而混淆查询。 当每个商户需要时,使用具有表结构的单独数据库 在系统中注册。在这种情况下,将维护一个主数据库以 保留商户数据库信息

这提供了最大的规模,但也为您提供了最大的维护开销

专业人士

可以根据您的客户类型及其提供的流量单独扩展每个数据库。 缺点

每个数据库的高维护性,因为单个参数在DB级别调整过SSD/共享缓冲区/fsync时间与磁盘/写入缓存等。 如果你开始设计一个系统,你不知道它在第一天会吸引什么样的流量,选择1。如果流量出乎意料地大,您可以始终垂直扩展,稍后通过散列机制将高流量客户放在另一个db上,该散列机制将客户放入db存储桶中

如果你希望站点流量足够大,并且已经为客户规划了容量,那么选择3。您必须承担维护开销的首当其冲,但至少可以根据访问的流量来扩展每个数据库


我不喜欢2,因为我看到这种方法让一些实现它的产品失望了。

如果应用程序只有CRUD操作和最小的关系层,那么最好使用NOSQL db,比如mongodb,易于与spring数据集成,如果移动应用程序是混合的,那么json层数据也将更高效。。。如果1或3是正确的选择,则取决于此处未提及的要求:您是否计划扩大规模或允许您的商户拍摄其数据的快照?您是否计划允许创建沙盒实例以用于演示/测试目的?让我们继续使用MySQL,因为问题不在于使用关系型或非sql。一些预期的数字会有所帮助。有多少商人?10公里..10米?有多少产品?产品的数量是无限的。如果有一天商家要求一个单独的系统,我们必须提供它,没有任何痛苦。你认为一个选项也可以这样做。什么是单独的系统?您的意思是使用全新的databa部署后端 他是谁?