【问题标题】:How would you create a data inheritance database?您将如何创建数据继承数据库?
【发布时间】:2012-07-26 16:18:46
【问题描述】:

首先,这不是关于如何在关系数据库中实现继承的问题。

问题:

我的系统有几个子系统,可能还有其他几个子系统,依此类推。 我需要创建一个数据库来存储每个系统的配置参数。当子系统没有提供自己的设置时,子系统将从父系统继承设置。继承是基于每个参数而不是它的完整集。

基本上...

存储时:

  • 系统 A:背景:白色,堆栈大小:100,线程:50
    • 系统 A-1:背景:蓝色,堆栈大小:空,线程:空
      • 系统 A-1-1:background:null,stack-size:10,threads:null
    • 系统 A-2:background:null,stack-size:null,threads:150

加载时:

  • 系统 A:背景:白色,堆栈大小:100,线程:50
    • 系统 A-1:背景:蓝色,堆栈大小:100,线程:50
      • 系统 A-1-1:背景:蓝色,堆栈大小:10,线程:50
    • 系统 A-2:背景:白色,堆栈大小:100,线程:150

您将如何实现这一点,以便它也可以快速加载?

我愿意使用 NoSql 和 Sql 解决方案。但是我使用它的应用程序将用 C# 编写。

提前致谢。

【问题讨论】:

    标签: .net sql database inheritance nosql


    【解决方案1】:

    我之前(在 MS Sql Server 中)使用自引用配置表实现了类似的东西。每个条目将指定系统、父系统和设置名称/值。这允许灵活地保存哪些设置(而不是有一个背景列、线程列等)。只要级别数不超过最大递归深度,您就可以使用递归CTE 计算给定系统的设置。作为开始的地方:

    CREATE TABLE Configuration (
        SystemId varchar(30), 
        ParentSystemId varchar(30), 
        Name varchar(30), 
        Value varchar(30)
    )
    

    并检索系统的配置:

    ;WITH SystemConfig (Id, ParentId, Name, Value, Rank) AS (
        SELECT SystemId, ParentSystemId, Name, Value, 1
        FROM Configuration C
        WHERE SystemId = @SystemId
    
        UNION ALL
    
        SELECT D.SystemId, D.ParentSystemId, D.Name, D.Value, Rank + 1
        FROM Configuration D
        INNER JOIN SystemConfig S ON S.ParentId = D.SystemId
    )
    
    SELECT DISTINCT K.Name, V.Value 
    FROM SystemConfig K
    CROSS APPLY (
        SELECT TOP 1 Value
        FROM SystemConfig G
        WHERE K.Name = G.Name
        ORDER BY Rank
    ) V
    

    演示SQL Fiddle

    我不能说这是否是 SQL 中最有效的方法,而且我从未尝试过 NoSql 解决方案,但这可以完成工作并且合理的索引表现良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2014-04-30
      • 2018-01-07
      相关资源
      最近更新 更多