如何为访问它的应用程序分割数据库(对于多个用户问题,a.k.a。单个数据库)?

时间:2011-06-29 12:35:02

标签: php mysql database database-design

我为一个用户构建了一个Web应用程序,但现在我想将它提供给许多用户(这是一个摄影师的应用程序)。

多个数据库问题

我首先通过为每个用户创建一个应用程序来做到这一点,但这有很多问题,例如:

  • 访问新用户无法实现自动化(或非常困难),因为我必须创建子域,数据库,初始表,将代码复制到新位置等。这是手动操作的繁琐工作。 !
  • 我无法轻松创建使用情况的报告和统计数据,例如我的用户有多少个项目,有多少张照片等。

单个数据库问题

但是每个用户只有一个数据库会在代码中产生自己的问题:

  • 现在我必须更改数据库架构以容纳额外的用户,例如具有user_id列的项目表(对于其他一些表,如设置等)。
  • 我必须查看访问数据库的几乎每行代码并编辑用于选择和插入的SQL,以便我为该特定用户提供sava数据,同时进行连接以便检查权限({{ 1}})。
  • 如果我忘记在代码中的某个位置执行此操作,则意味着安全漏洞或其他不愉快的事情(考虑通过像我以前那样执行select ... from projects inner join project_users ... where user_id = ?来显示用户的项目 - 它将显示所有用户的项目)
  • 备份:备份更难,因为整个数据库有更多数据,如果用户说:“嘿,我今天犯了错误,你能否将数据库恢复到昨天”,我可以'这很容易做到。

解决方案?

我已经阅读了有关stackoverflow的多个问题,并决定我应该选择“单一数据库”路由。但是如果有可能的话,我想摆脱这些问题。 所以我在想是否有办法以某种方式对我的数据库进行分段,这样我就不会得到这些讨厌的(有时是看不见的)错误? 如果需要,我可以重新编程数据库访问层,但我使用的是SQL而不是OO getter和setter方法。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我认为这个问题没有灵丹妙药 - 尽管你可以做些事情。

首先,您可以让新设计使用不同的MySQL用户,并拒绝用户“选择”权限,这些权限只能通过与“users”表的连接来访问。然后,您可以创建一个将两个表连接在一起的视图,并在运行“select”查询时使用该视图。这样,如果你忘记了一个查询,它就会失败,而不是默默地。当然,您也可以通过这种方式限制插入,更新和删除 - 尽管这对于视图来说要困难得多。

修改 因此,如果您的应用程序当前连接为“web_user”,则可以撤消该用户对项目表的选择访问权限。相反,您可以创建一个视图“projects_for_users”,并将该视图的“选择”权限授予新用户 - 也许是“摄影师”。新用户也不应该选择“项目”。

然后,您可以逐步重新编写应用程序的数据访问,并且您确定已经捕获了应用程序选择项目的每个实例,因为在尝试检索数据时它会爆炸 - 您的用户都不会会在项目表上拥有“选择”权限。

作为一个小小的奖励 - 使用where子句进行更新时也需要选择权限,因此您还可以找到应用程序更新项目表而不进行重写的实例。

其次,您要考虑配置过程 - 您将如何向新用户授予对系统的访问权限?谁这样做?同样,通过将可以将记录插入“用户”的数据库用户分开,您可以避免系统中的页面比您认为的更多的愚蠢错误。使用这种系统,通常有几个步骤构成配置过程。确保从常规用户权限中分离出这些任务的权限。

修改 供应是为新用户设置服务的一个词(我认为它来自电话世界,电话公司将谈论在现有电话线上配置新服务)。它通常包括一大堆业务流程 - 流程中的每个步骤都必须成功,才能启动下一个流程。因此,在您的应用中,您可能需要设置新的用户帐户,验证其电子邮件地址,设置存储空间等。每个步骤都需要被视为流程中的一个步骤,而不仅仅是单个任务。

最后,当你这样做时,你也可以考虑不同级别的特权。您的系统会不同类型的用户?摄影师,谁可以上传作品,审稿人谁不能?如果这是一个可能的功能扩展,您可能希望立即建立支持,即使您在上线时支持的唯一类型的用户是摄影师。

答案 1 :(得分:0)

嗯,是时候面对一些事实了 - 我想。您描述的“单个数据库问题”不是问题,而是正常(通常)设计。很多时候,一个只是很多的特例。

出于某种原因,您为一个用户设计了一个网络应用程序 - 而不是很多用户。

所以,是时候重新设计了。