【发布时间】:2015-07-20 23:03:03
【问题描述】:
我正在处理一个项目,而且我对 Web 应用程序和 SQL 都是新手,所以请耐心等待。我正在构建一个 API,我想确保我的用户只能访问特定表中的某些行,这些行在另一个表中具有其客户 ID 的外键,但必须通过另一个表中的用户 ID 进行验证。 (一个客户有多个用户并拥有多个资产。目前,客户的所有用户都可以访问任何资产,但没有客户共享资产或用户。)我认为这样做的方法是这样做
SELECT * FROM [Asset] WHERE Id=@AssetId AND CustomerId=(SELECT CustomerId FROM [User] WHERE UserId=@UserId);
这很好,但是由于 Asset 和 User 表中有许多条目,此查询可能会占用大量时间。这很糟糕,因为对我的 API 发出的每个需要资产数据的请求都应该进行此检查。我可以设置一个索引,实际上 UserId 是 User 中的辅助键,因为它是来自身份验证提供程序的唯一标识符,但我不确定是否应该在 Asset.xml 中为 CustomerId 添加索引。与其他一些表相比,资产表的增长应该相对缓慢(有一个用于审计目的的消息记录表),但我不确定这是否是正确的答案,或者是否有一些更简单的更优化的答案。还是这种查询速度如此之快以至于我无需担心?
【问题讨论】:
-
如果您的表足够大,您应该受益于 CustomerId 上的索引以加快两个表之间的连接,并从 UserId 上加快查找速度。另外,您是否考虑过在 Azure SQL 数据库上使用新的行级安全功能?它旨在通过自动为您应用访问逻辑来简化这些类型的查询。 msdn.microsoft.com/en-us/library/Dn765131.aspx
标签: sql tsql authentication azure-sql-database azure-api-apps