Sql 特定于用户的数据库记录

Sql 特定于用户的数据库记录,sql,database,database-design,sql-server-2008-r2,Sql,Database,Database Design,Sql Server 2008 R2,这更多的是一个理论问题。不管怎样, 假设我有一个数据库(50个表) 所有这些表中的数据都应该专门保存给一个用户。 我的意思是,通常我们为每个特定于用户的表执行外键。以及使用以下方法检索数据: select Column1,Col2,Col3 from Table where UserId=@UserId 这会使查询变得非常混乱。存储这些数据还有其他方法吗?可能还有其他方法,但我不会说它们更好。如果每个表中的每个记录都需要属于特定的用户,那么您需要一种方法来定义它 减少UserId列数量的一种可

这更多的是一个理论问题。不管怎样, 假设我有一个数据库(50个表) 所有这些表中的数据都应该专门保存给一个用户。 我的意思是,通常我们为每个特定于用户的表执行外键。以及使用以下方法检索数据:

select Column1,Col2,Col3 from Table where UserId=@UserId

这会使查询变得非常混乱。存储这些数据还有其他方法吗?

可能还有其他方法,但我不会说它们更好。如果每个表中的每个记录都需要属于特定的用户,那么您需要一种方法来定义它

减少UserId列数量的一种可能方法是,如果您有子表,并且您只是假设父表定义了所有权,并且暗示它的子记录属于该用户

例如:

CarMake:
MakeId
MakeName
UserId

CarModel:
ModelId
MakeId
ModelName

注意CarModel没有UserId列,但是可以假设它继承了父CarMake记录的相同UserId。如果您不能假定子用户总是继承父用户ID,那么您原来的方法是最好的。

您所指的有一个名称。它叫。该链接提供了有关多租户结构的一些一般信息

但这一切都取决于您的RDBMS。Oracle提供了一个工具,使这项工作变得非常简单。


成为可以应用于表的策略。您还可以创建一个受保护的存储过程来更新@User_id,以确保未经授权不能对其进行更改。然后,使用这种策略对表进行的每个查询都会在后台添加where子句。它是自动的,无法避免。

您可以创建视图来清除查询。例如,如果您有
客户
客户地址
客户电话
。。。您可以创建
客户\u full
。这将使任何关于客户的查询更干净,而不是N个连接,您将有1个视图。+1这是一个很好的建议。它使您拥有过时数据的可能性大大降低。在Oracle中,它被称为虚拟专用数据库或行级安全性。取决于和你说话的人的年龄。
WHERE User_ID = @User_ID