我为一个用户构建了一个Web应用程序,但现在我想将它提供给许多用户(这是一个摄影师的应用程序)。
我首先通过为每个用户创建一个应用程序来做到这一点,但这有很多问题,例如:
但是每个用户只有一个数据库会在代码中产生自己的问题:
select ... from projects inner join project_users ... where user_id = ?
来显示用户的项目 - 它将显示所有用户的项目) 我已经阅读了有关stackoverflow的多个问题,并决定我应该选择“单一数据库”路由。但是如果有可能的话,我想摆脱这些问题。 所以我在想是否有办法以某种方式对我的数据库进行分段,这样我就不会得到这些讨厌的(有时是看不见的)错误? 如果需要,我可以重新编程数据库访问层,但我使用的是SQL而不是OO getter和setter方法。 任何帮助将不胜感激。
答案 0 :(得分:1)
我认为这个问题没有灵丹妙药 - 尽管你可以做些事情。
首先,您可以让新设计使用不同的MySQL用户,并拒绝用户“选择”权限,这些权限只能通过与“users”表的连接来访问。然后,您可以创建一个将两个表连接在一起的视图,并在运行“select”查询时使用该视图。这样,如果你忘记了一个查询,它就会失败,而不是默默地。当然,您也可以通过这种方式限制插入,更新和删除 - 尽管这对于视图来说要困难得多。
修改强> 因此,如果您的应用程序当前连接为“web_user”,则可以撤消该用户对项目表的选择访问权限。相反,您可以创建一个视图“projects_for_users”,并将该视图的“选择”权限授予新用户 - 也许是“摄影师”。新用户也不应该选择“项目”。
然后,您可以逐步重新编写应用程序的数据访问,并且您确定已经捕获了应用程序选择项目的每个实例,因为在尝试检索数据时它会爆炸 - 您的用户都不会会在项目表上拥有“选择”权限。
作为一个小小的奖励 - 使用where子句进行更新时也需要选择权限,因此您还可以找到应用程序更新项目表而不进行重写的实例。
其次,您要考虑配置过程 - 您将如何向新用户授予对系统的访问权限?谁这样做?同样,通过将可以将记录插入“用户”的数据库用户分开,您可以避免系统中的页面比您认为的更多的愚蠢错误。使用这种系统,通常有几个步骤构成配置过程。确保从常规用户权限中分离出这些任务的权限。
修改强> 供应是为新用户设置服务的一个词(我认为它来自电话世界,电话公司将谈论在现有电话线上配置新服务)。它通常包括一大堆业务流程 - 流程中的每个步骤都必须成功,才能启动下一个流程。因此,在您的应用中,您可能需要设置新的用户帐户,验证其电子邮件地址,设置存储空间等。每个步骤都需要被视为流程中的一个步骤,而不仅仅是单个任务。
最后,当你这样做时,你也可以考虑不同级别的特权。您的系统会不同类型的用户?摄影师,谁可以上传作品,审稿人谁不能?如果这是一个可能的功能扩展,您可能希望立即建立支持,即使您在上线时支持的唯一类型的用户是摄影师。
答案 1 :(得分:0)
嗯,是时候面对一些事实了 - 我想。您描述的“单个数据库问题”不是问题,而是正常(通常)设计。很多时候,一个只是很多的特例。
出于某种原因,您为一个用户设计了一个网络应用程序 - 而不是很多用户。
所以,是时候重新设计了。