单用户应用程序 File/Data 存储建议

Single User Application File/Data Storage Recommendations

我目前有一个 C# winform 应用程序,您可以在其中输入最终相关的数据。存储的数据量并不大。原始版本使用SQL CE 来存储信息。但是,我发现它很慢。另外,我希望能够使用我自己的扩展名保存应用程序文件。

我已经改变了我的方法,基本上使用 class 对象将我的数据加载到内存中。为了保存,我只是使用 ProtoBuf 序列化所有内容,并在打开文件时反序列化。这种方法快如闪电,并且在用户单击保存之前永远不会保留更改。但是,我发现查询分层数据有点麻烦。我使用 Linq-To-Objects 查询数据。我会让 ClassA 有一个 GUID 密钥。我可以通过 GUID 在 ClassB 中引用 ClassA。但是,我真的不能做一个简单的 SQL 连接类型查询来获取 ClassB 属性和 ClassA 属性。我通过 GUID 上的 LINQ 查询在 ClassB 上创建一个导航 属性 到 ClassA 那个简单的 returns ClassA 来绕过它。但是这样会造成大量的集合扫描。

有哪些选项可以为我提供快速的单用户关系文件存储?我仍然希望在内存中工作,在用户使用文件|保存之前不会保留更改。我还希望能够继续使用 LINQ 查询数据。我正在考虑 SQLite 作为一个选项。有没有更好的选择或方法适合我?

更新

我不知道 ProtoMember 属性中的 AsReference 选项 [ProtoMember(5, AsReference = true)]。如果我放弃 classes 中的外键并简单地引用相关对象,那么看起来我可以在保留对象引用的同时使用 ProtoBuf 进行序列化和反序列化。因此,我可以轻松地使用 Linq-To-Objects 来查询我的对象。我需要停止从数据库方面思考。

如果您的所有对象都处于某种层次结构中,您还可以将完全相同的对象存储在其他结构中,开销为 4 bytes/object(32 位机器)。

假设您有一个基础对象,例如:

public class HierarchyElement
{
    public List<HierarchyElement> Children { get; set; }
    public HierarchyElement Parent { get; set; }
}

所以你在局部变量中有根元素,它通过子 属性 和第一个子的子 属性 等在层次结构中存储未知数量的对象.

但是,在构建该对象时或反序列化它之后,您可以将对每个 HierarchyElement 的引用添加到列表(或您选择的其他平面结构)。

然后您可以使用这个平面列表来执行您的 Linq 查询。