1

我正在做一个项目,我对 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 中为 CustomerId 添加索引。与其他一些表相比,资产表的增长应该相对缓慢(有一个用于审计目的的消息记录表),但我不确定这是否是正确的答案,或者是否有一些更简单的更优化的答案。还是这种查询在规模上如此之快以至于我无需担心?

4

1 回答 1

1

对于您的特定情况,它看起来像是在 User 表和 Asset 表之间构建联结表的完美上下文。这两个字段一起将成为主键。AssetId 和 UserId 分别是外键。

假设联结表称为 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 数据库。

于 2015-07-20T23:26:59.110 回答