我已经制作了一个自定义CMS,我想让它成为多客户端,同时尽可能少地复制。我不是指同一个组织中不同人访问同一个程序的多用户,我指的是不同组织中的多个客户端使用他们自己对同一程序的访问权,就好像它们是独立的应用程序一样。
我理解共享函数的原理,我想我需要将我创建的所有函数放在父目录中的共享文件夹中。
我认为至少我已经了解了代码的工作方式,但数据库(sql)结构似乎是最大的挑战。
这通常如何实现?
我的表格非常基本,我可以在阅读之后看到,只需在每个表格和条目中添加“client_id”或“app_id”或类似内容即可。这样就没有数据库的重复,但是你会在同一个表中得到所有客户数据的混合。如果这个程序变得非常大,许多客户端数据成倍增加,系统的速度也是如此,那么问题就出现了。然而,我还没有到那个阶段,所以我不应该担心那个遥远的地方并且当它到来时越过那座桥梁,因为现在速度的牺牲可以忽略不计?
如果我将来更改表的结构或添加额外的字段等,是否有可能以某种方式保持数据库分离而不会增加工作量?
我知道如果不知道我构建表格的方式,这可能很难回答,但它们非常简单:
unique_id | title | modified_date | content
xx hello 0000-00-00 00:00:00 i am content
到目前为止,我能想到的最好的是,这将成为:
client_id | unique_id | title | modified_date | content
xx xx hello 0000-00-00 00:00:00 i am content
像我说的那样,我发现这可能会遇到一些问题,主要是因为在赛道上变得臃肿但是现在我看不到另一种方式 - 也许你有另一种方式来看待这个。感谢。
答案 0 :(得分:2)
将其保留为添加了client_id列的单个数据库。如果它与许多客户端一起变大,请按LIST对表进行分区:http://dev.mysql.com/doc/refman/5.5/en/partitioning-list.html
水平分区允许您对一个逻辑表进行细分,因此当您的SQL包含“... WHERE client_id = 1”时,它只需要读取包含“client_id =”的索引或分区1“数据。其他分区将被忽略,几乎就像每个client_id都有一个单独的表一样。
免责声明:我自己没有在MySQL中使用分区。我只熟悉Oracle的概念。确保您的MySQL存储引擎支持分区:http://dev.mysql.com/doc/refman/5.5/en/partitioning.html
答案 1 :(得分:1)
最好的办法是让它为每个客户的数据使用单独的数据库,并将所有共享信息(用户等)保留在一个中央数据库中。然后,当客户端增长时,可以将它们移到另一个数据库服务器而不会影响其他任何人。
答案 2 :(得分:1)
我的web-app也有类似的情况:许多用户共享一个数据库,其中大多数表都有一个客户端标识符。它不是CMS,但足够相似,用户正在对其数据执行CRUD操作。
有利有弊,但我不会过分担心表现。由于您必须重新创建现有的唯一索引以包含客户端ID,因此您应该看到性能没有太大差异:您的查找现在有一个额外的谓词,它出现在索引中。
正如乔治3所说,如果你有一个或几个客户的大量,水平分区可能值得追求。但过早的优化和所有这些:我会等着看它是否首先成为一个问题。
为不同的客户端管理多个数据库或多个版本的表不能很好地扩展,并且是维护的噩梦。只需获得内容的安全性。