2010-04-27 46 views
0

目前,我正在研究标题行中提到的迁移。问题是保存在注册表中的应用程序配置有一个树状结构,例如:从Windows注册表迁移到SQLite的应用程序配置

X 
|->Y 
    |->Z 
     |->SomeKey someValue 
W 
|->AnotherKey anotherValue 

等等。

如何在SQLite(或任何其他数据库)中建模该结构?如果您有类似问题的经验,请发邮件。提前致谢。

+0

你用SQLite去的任何特定原因? – R0MANARMY 2010-04-27 15:01:59

+0

我已经对SQLite进行了基准测试并对其进行了审查,并在此应用程序的另一部分中使用它,并使用了自定义和相对较快的C++包装器。 – 2010-04-27 15:12:44

+0

虽然它可能不是这个特定任务的正确工具。我无法想象性能问题是您转移到SQLite的原因。 – R0MANARMY 2010-04-27 16:29:43

回答

1

Baris,这个结构类似于一个目录/文件结构。 您可以使用一个简单的父亲<>子关系对目录和键值对进行建模。

喜欢的东西

Directory: 
id integer auto_increment; 
name string not null; 
parent_id integer not null default 0; 

Property: 
id integer auto_increment; 
key string; 
value string; 
directory_id integer not null; 

有了这个,你可以通过查看WHERE PARENT_ID = someid和寻找directory_id = someid对性能解决根目录下搜索与PARENT_ID = 0,子目录的目录。

希望这有助于:)如果你想存储的层次结构由以前的海报提到

0

在关系数据库中表示层次结构非常简单。你只是使用自引用。例如,您有一个类别表,其中有一个名为ParentCategoryId的字段,该字段为null(对于叶子类别)或父类别的ID。你甚至可以设置外键来执行有效的关系。这种结构很容易在代码中遍历,通常是通过递归,但是在编写sql查询时很痛苦。

注册表克隆的一种解决方法是使用注册表键值路径作为键。也就是说,Path中有一个条目是“X/Y/Z/SomeKey”,值是“someValue”。这将更容易查询,但可能无法按照您喜欢的方式表示层次结构。也就是说,你只有价值而不是层次结构的整体结构。

底线是你必须妥协,将具有未知数量级别的层次结构映射到关系数据库结构上。

0

自引用的表都不错,他们成为当你开始选择树的叶子的吸引力。

  1. 您能说明从配置中检索数据的用例吗?

  2. 您打算一次加载整个配置还是单独检索每个参数?

  3. 叶节点的深度会有多大?

相关问题