我已经为一名用户构建了一个 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/