php - 如何为访问数据库的应用程序分段数据库(也称为多个用户问题的单个数据库)?

标签 php mysql database database-design

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

多个数据库问题

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

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

单一数据库问题

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

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

解决方案?

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

最佳答案

我认为这没有 Elixir - 尽管您可以做一些事情。

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

编辑 因此,如果您的应用程序当前以“web_user”身份连接,您可以撤销该用户对项目表的选择访问权限。相反,您可以创建一个 View “projects_for_users”,并将对该 View 的“选择”权限授予新用户(也许是“摄影师”)。新用户也不应该具有对“项目”的选择访问权限。

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

还有一点额外的好处 - 使用 where 子句进行更新也需要 select 权限,因此您还可以找到应用程序更新项目表而无需重写的实例。

其次,您需要考虑配置过程 - 您将如何向新用户授予系统访问权限?谁做这个?同样,通过将可以插入记录的数据库用户分离到“用户”中,您可以避免出现愚蠢的错误,即系统中的页面所做的事情比您想象的要多。对于这种系统,配置过程通常由几个步骤组成。确保将这些任务的权限与常规用户权限分开。

编辑 配置是为新用户设置服务的词(我认为它来自电话世界,电话公司会谈论在现有电话线上配置新服务)。它通常包括一整套业务流程 - 并且流程中的每个步骤都必须成功才能开始下一个步骤。因此,在您的应用程序中,您可能需要设置一个新的用户帐户,验证他们的电子邮件地址,设置存储空间等。每个步骤都需要被视为流程中的一个步骤,而不仅仅是一个任务。

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

关于php - 如何为访问数据库的应用程序分段数据库(也称为多个用户问题的单个数据库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520702/

相关文章:

php - 向MYSQL中插入字符串和数组的组合

mysql - 在 PHP fwrite 函数中进行 MYSQL 查询

database - 如何使用 liquibase,一个具体的例子

php - id 唯一的 Laravel 规则验证

php - Yii2 - ListView 搜索表单

php - 在 yii ajaxSubmitButton 中的 ajax 请求之前和之后调用 JavaScript 函数

php - 具有多个 ands 和 ors 的 Mysql 查询

mysql - 在闭包表模型中有多个根?

c++ - 将注册表访问转换为来自 MFC 功能包的数据库调用

python - 如何在Python中正确安装MySQL模块