您将如何创建数据继承数据库?

时间:2012-07-26 16:18:46

标签: .net sql database inheritance nosql

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

问题:

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

基本上...

存储时:

  • 系统A:背景:白色,堆叠尺寸:100,线程:50
    • 系统A-1:背景:蓝色,堆叠尺寸:null,线程:null
      • 系统A-1-1:背景:null,堆叠尺寸:10,线程:null
    • 系统A-2:背景:null,堆叠尺寸:null,线程:150

加载时:

  • 系统A:背景:白色,堆叠尺寸:100,线程:50
    • 系统A-1:背景:蓝色,堆叠尺寸:100,线程:50
      • 系统A-1-1:背景:蓝色,堆叠尺寸:10,线程:50
    • 系统A-2:背景:白色,堆叠尺寸:100,线程:150

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

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

提前致谢。

1 个答案:

答案 0 :(得分: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解决方案,但这可以完成工作并且合理的索引表现良好。