【发布时间】:2020-01-28 18:38:31
【问题描述】:
我们正在设计的数据库允许用户通过多个第三方服务进行身份验证,主要是社交媒体(推特、脸书等)。这些服务的数量将不为人知且不断增加。每个服务都需要一组独特的数据进行身份验证,这与其他服务不同。
一个 用户可以验证许多 服务,但他们只能验证每个服务中的一个服务的类型。
可能的解决方案:
A) 这个问题最直接的解决方案是简单地为每个服务添加一个列到包含该服务的 JSON 身份验证的 user 表。但是,这违反了规范化,因为在数据库中留下了大量的空值。例如,当有 50 个这样的集成时会发生什么?
B) 每个服务在数据库中都有自己的表。不再需要 JSON,因为可以正确描述每个字段。然后每个服务都需要一个查找表“user_has_service”。这是一个只包含两个外键的表,一个用于用户,一个用于服务,将它们链接在一起。这个选项看起来是最正确的,但是效率非常低,并且会通过许多操作来确定用户拥有哪些服务,并随着服务数量的增加而增加。我相信在这种情况下,查找表的 ID 字段需要是 user 和 service 的某种哈希值,这样就不可能重复插入。
根本不是数据库专家,我已经为此苦苦挣扎了很长一段时间。有什么想法吗?
【问题讨论】:
-
@philipxy 不,不是。 1) 应查看数据;分析;通过数据分析和关系模型设计,而不是通过 OO 的短视的非数据镜头。 2) 然而,简单来说,OO 继承转换为关系子类型。 3)这个问题与OO继承无关(尽管OO继承或任何其他OO boondogle都可以应用于它),这里没有OO继承。这里的继承(英语、数学、Codd 定义,而不是 OO 定义)在于关系键:参考我的答案。
-
@PerformanceDBA 链接的问题使用“继承”一词,但它及其答案是关于以关系方式处理子类型。 (虽然继承碰巧涉及子类型的特殊情况。)
-
@philipxy。是的,我知道。唯一适用于数据库上下文的 OO 继承类型是子类型,并且在这个问题中不存在。这就是为什么这个 Q 不是那个 Q 的骗子。请再次阅读我的评论。
标签: sql database database-design relational-database database-normalization