从Windows注册表迁移到SQLite的应用程序配置
问题描述:
目前,我正在研究标题行中提到的迁移。问题是保存在注册表中的应用程序配置有一个树状结构,例如:从Windows注册表迁移到SQLite的应用程序配置
X
|->Y
|->Z
|->SomeKey someValue
W
|->AnotherKey anotherValue
等等。
如何在SQLite(或任何其他数据库)中建模该结构?如果您有类似问题的经验,请发邮件。提前致谢。
答
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,子目录的目录。
希望这有助于:)如果你想存储的层次结构由以前的海报提到
答
在关系数据库中表示层次结构非常简单。你只是使用自引用。例如,您有一个类别表,其中有一个名为ParentCategoryId的字段,该字段为null(对于叶子类别)或父类别的ID。你甚至可以设置外键来执行有效的关系。这种结构很容易在代码中遍历,通常是通过递归,但是在编写sql查询时很痛苦。
注册表克隆的一种解决方法是使用注册表键值路径作为键。也就是说,Path中有一个条目是“X/Y/Z/SomeKey”,值是“someValue”。这将更容易查询,但可能无法按照您喜欢的方式表示层次结构。也就是说,你只有价值而不是层次结构的整体结构。
底线是你必须妥协,将具有未知数量级别的层次结构映射到关系数据库结构上。
答
自引用的表都不错,他们成为当你开始选择树的叶子的吸引力。
您能说明从配置中检索数据的用例吗?
您打算一次加载整个配置还是单独检索每个参数?
叶节点的深度会有多大?
你用SQLite去的任何特定原因? – R0MANARMY 2010-04-27 15:01:59
我已经对SQLite进行了基准测试并对其进行了审查,并在此应用程序的另一部分中使用它,并使用了自定义和相对较快的C++包装器。 – 2010-04-27 15:12:44
虽然它可能不是这个特定任务的正确工具。我无法想象性能问题是您转移到SQLite的原因。 – R0MANARMY 2010-04-27 16:29:43