这是一种基于用户选择数据库的好方法吗?
本文关键字:选择 数据库 方法 用户 于用户 一种 | 更新日期: 2023-09-27 17:54:08
我正在使用ASP开发一个系统。. NET MVC + WebAPI + AngularJS,它具有以下属性:用户可以登录,不同的用户拥有完全不同的数据。原因很简单:系统允许管理数据,但是尽管模式对每个人来说都是一样的,用户之间的数据是完全断开的。即使考虑到组织、一致性和安全性,每个用户也需要一个单独的数据库。
这就产生了一个问题:尽管每个数据库都应该是相同的,即相同的表和列,因此相同的EF数据上下文,但是连接是不同的。这让我感到困惑,因为我习惯于在配置XML文件中指定连接字符串,而这不能在这里完成,因为连接字符串将是动态的。
然后我想到了一个解决方案,我现在不知道它是否是最好的解决方案:我创建一个存储库,它在其构造中接收登录用户的用户名。然后,存储库在系统的数据库上查找该登录用户的连接数据(当用户注册时将通知此数据)。然后存储库构建连接字符串并将其提供给DbContext
。
这是解决这个问题的好方法吗?或者有更多推荐的方法来处理这种事情?安全性是这里的一个重要问题,因此我不确定我的方法。
实体框架解决方案中的每个数据上下文都有一个允许您指定连接字符串的构造函数重载。您可以在下面的链接中找到如何构建和使用该连接字符串。
参考
如何:建立一个EntityConnection连接字符串
也就是说,除非您有非常特殊的需求,否则从维护和操作的角度来看,最好是简单地将UserID放在适当的表中,并对当前登录的UserID进行过滤。
每个用户一个数据库对我来说似乎是一个疯狂的解决方案。
在包含每个用户数据的表中包含user_id
列,并对其进行适当的过滤。
我认为这取决于每个用户的数据库有多复杂。如果我们谈论的是5-10个表,那么为所有表添加、管理和查询添加ID列要比管理多个数据库容易得多。但是,模型变得越复杂,数据库中的表越多,那么与每个表多一列并必须在所有查询中添加用户检查相比,为每个用户配置一个数据库变得容易得多。尤其是那些比较复杂的。
性能也是如此。如果您希望用户数据库的数据量增长,那么拥有单独的数据库可以通过将不同的数据库放入不同的服务器来实现水平扩展。
如果用户请求对其数据的原始访问,共享数据库也会产生问题。这是可能发生的,例如当他们想要迁移数据时。