我有一个想法,如何解决这个问题,但我想知道如果有什么更容易和更可扩展到我的问题。

该程序的,我的工作有两种基本形式的数据:图像,该信息相关的那些图像。相关的信息与图像先前已经存在一个喷射数据库的极端简单(表四)其原来是两个缓慢和不完整的存储领域。我们要搬到一个新的执行情况的数据存储。给出简单的数据结构的参与,我在想,一个数据库被矫枉过正。

每一个图像信息的它自己的(捕获的参数),将组的一部分的图像,它们是相互关联的(采取了在同一个三十分钟的时期,说),然后部分的一个较大的集团完全(采取相同的人)。现在,我保存人在一词典有一个独特的识别符。每个人然后有一个列表中的不同群体的照片,并且每个图像组有名单的图片。所有这些课程序列化,以及我只是序列化和反序列化的字典。相当简单的东西。图像分开存放,所以这本字典不会成为天文学的大小。

问题是:什么时候会发生,我需要添加新的信息领域?是有一个简单的方法来安装这些数据结构以考虑到潜在的未来版本?在过去,我会处理这个C是建立一个序列化的结构有很多空位(至少一个k)对于未来的扩展,其中一个字节的结构表示的版本。然后,当程序读的结构,它想知道其中反对使用基于大量的交换机的声明(旧版本的可读的新数据,因为无关的数据将只是进入的领域被忽略)。

不这样一个方案存在C#?就像,如果我有一个类的一个组串和Int的对象,然后我加入另一串对象的结构,怎么可以,我deserialize一个对象从磁盘,然后添加串呢?做我要辞职,自己具有多种版本的数据类和一个工厂,这需要一个反流和处理反根据一些版本的信息储存在一个基类?或是类似的字典适用于储存此种信息,因为它将deserialize的所有领域的磁盘上自动的,如果有新的领域增加在,我就可以赶上的例外情况和替代品,在空白的串整数为这些价值观?

如果我去的字典的做法,那里的速度撞击相关文件的读写以及参数检索的时间?我认为,如果只有领域中的一类,然后领域是即时检索,但是在字典中,有一些小的开销与这一类。

谢谢!

有帮助吗?

解决方案

我的大脑是炸的时刻,所以我不确定我是否可以建议或反对一个数据库,但是如果你想寻找版立性化,你就是一个傻瓜没有至少检查到 协议的缓冲区.

这里有一个快速列表实现我知道关于C#/.网:

其他提示

Sqlite 就是您想要的。它是一个快速,可嵌入的单文件数据库,可以绑定大多数语言。

关于可扩展性,您可以使用默认属性存储模型,然后为将来的更改提供单独的属性扩展表。

未来一两年,如果代码仍在使用中,您会很高兴1)其他开发人员不必学习自定义代码结构来维护代码,2)您可以导出,查看,使用标准数据库工具修改数据(有一个用于sqlite文件和各种查询工具的ODBC驱动程序),以及3)您将能够以最少的代码更改扩展到数据库。

只是一个小小的警告,SQLLite,Protocol Buffers,mmap等...都非常好,但你应该对每个实现进行原型设计和测试,并确保你不会遇到相同的性能问题或不同的瓶颈。 / p>

简单性可能只是升级到SQL(Express)(您可能会对性能增益感到惊讶)并修复当前数据库设计中缺少的内容。然后,如果仍然是一个问题,开始调查这些其他技术。

有一个数据库方案,为此,我不可能记住的名字,那就可以处理这种情况。你基本上有两个表格。一个表中储存的变量名称和其他商店的变量值。如果你想要集团的变量,然后增加第三个表,将会有一个对许多关系,与的变量名称表。这种设置具有优势的让你保持增加不同的变量,而不必不断变化的数据库架构。救了我的熏肉好几次当处理部门改变主意经常(如市场营销).

唯一的缺点是,可变数值表将需要存储的实际价值作为一串列(varchar或限实际上).然后你必须处理的麻烦的转换值回到他们的母代表。我目前保持这样的事情。变量表目前有大约800万行。它仍然是相当快的,因为我仍然可以检索的某些变化值在下一秒钟。

我不C#程序但是我喜欢的mmap()呼吁,看到有一个项目做这样的事情。

看看 Mmap

结构化的文件是非常执行,如果针对一个具体的应用,但难以管理的和不可重复使用代码的资源。一个更好的解决方案是一个虚拟存储状执行情况。

  • 高达4千兆字节的信息可以管理。
  • 空间能够优化为实际数据的大小。
  • 所有的数据可以被看作是一个单列,并访问有读写操作。
  • 不需要结构存储但是,仅仅使用和储存。
  • 可以缓存。是非常可重复使用。

因此,请使用sqllite,原因如下:
1.每次都不需要从磁盘读取/写入整个数据库 2.即使你没有在开头留下足够的占位符,也容易添加 3.更容易根据您想要的任何内容进行搜索 4.更容易以超出应用程序设计的方式更改数据

字典方法的问题
1.除非你制作了智能字典,否则每次都需要读/写整个数据库(除非你仔细设计数据结构,否则很难保持向后兼容性)
----- a)如果你没有留下足够的占位符bye bye
2.看起来好像你必须对所有照片进行线性搜索才能搜索其中一个捕获属性 3.图片可以在多个组中吗?一张照片可以不止一个人吗?两个人可以在同一组吗?对于词典,这些东西会变得毛茸茸......

使用数据库表,如果获得新属性,则可以说Alter Table Picture Add Attribute DataType。然后,只要您不规定该属性必须具有值,您仍然可以加载并保存旧版本。同时,较新的版本可以使用新属性。

此外,您无需将图片保存在数据库中。您可以只存储数据库中图片的路径。然后,当应用程序需要图片时,只需从磁盘文件加载它。这使数据库大小更小。与加载图像的时间相比,获取磁盘文件的额外搜索时间很可能是微不足道的。

可能你的桌子应该是
图片(PictureID,GroupID?,文件路径,捕获参数1,捕获参数2等)。

如果您想要更灵活,可以制作一张桌子 CaptureParameter(PictureID,ParameterName,ParameterValue)......我建议不要这样做,因为它比将它们放在一个表中效率低得多(更不用说检索/搜索捕获参数的查询会更复杂)。 / p>

Person(PersonID,Name / Etc等任何人物属性)
组(GroupID,Group Name,PersonID?)
PersonGroup?(PersonID,GroupID)
PictureGroup?(GroupID,PictureID)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top