我正在开发一个项目,我是网络应用程序和SQL的新手,所以请耐心等待。我正在构建一个API,我想确保我的用户只能访问特定表中某些行,这些行在另一个表中具有其客户ID的外键,但必须通过另一个表中的用户ID进行验证。 (单个客户拥有多个用户并拥有多个资产。目前,所有客户的用户都可以访问任何资产,但没有客户共享资产或用户。)我认为这样做的方式是
SELECT * FROM [Asset] WHERE Id=@AssetId AND CustomerId=(SELECT CustomerId FROM [User] WHERE UserId=@UserId);
这很好,但是在资产和用户表中有很多条目,这个查询可能会耗费大量时间。这很糟糕,因为每次向我的API发出的需要Asset数据的请求都应该进行此检查。我可以设置索引,实际上UserId是User中的辅助密钥,因为它是来自auth提供程序的唯一标识符,但我不确定是否应该在Asset中为CustomerId添加索引。与其他一些表相比,Asset表的增长速度相对较慢(有一个用于审计目的的消息记录表),但我不确定这是否是正确的答案,或者是否有一些更简单的答案更加优化。或者这种查询如此快速,以至于我没有什么可担心的?
答案 0 :(得分:1)
对于您的特定情况,它看起来像是在User表和Asset表之间构建junction表的完美上下文。两个领域将成为主要关键。单独地,AssetId和UserId将为foreign keys.
假设联结表名为AssetUser。
外键:
CONSTRAINT [FK_AssetUser_User] FOREIGN KEY ([UserId]) REFERENCES [User]([UserId])
CONSTRAINT [FK_AssetUser_Asset] FOREIGN KEY ([AssetId]) REFERENCES [Asset]([AssetId])
主键:
CONSTRAINT [PK_AssetUser] PRIMARY KEY([AssetId], [UserId]));
除非您要获得大量数据和/或性能在您的应用程序中至关重要,否则您不必过于担心扩展。如果是这样,您可以选择使用hadoop或迁移到NoSQL数据库。