我正在设计一个数据库来保存科学研究项目的过去和未来数据。我试图通过删除所有与数据库无关的术语来简化讨论:)
我们假设我们收集了 Foo 和 Bar 对象。每个栏都是 Foo 的子,因为它属于它。 Foo 和 Bar 都可以拥有无限数量的属性(属性)。不同的属性可以有不同的数据类型,可以是数字,文本,图像,文件等。此外,每个对象的每个属性都有一个值的历史记录,必须存储在数据库中。
我希望能够在不编辑数据库结构的情况下添加新属性。我没有被迫使用任何特定的数据库软件,但我希望有一个Python接口,因为该组中的每个人都可以使用Python。最后,如果数据库是基于文件的,那将非常有用。
这是一个更好地代表上述描述的图表。希望它有所帮助。
我决定尝试使用SQLite,以获得可通过Python轻松访问的基于文件的数据库。这是我采用的数据库模式:
我正在使用Python的sqlite3
连接到它,pickle
将不同类型的数据放在BLOB value
列中。这种方法的缺点当然是SQLite不知道value
内部的内容,因此我需要每次都检索所有内容以运行搜索,而我无法利用SQL查询。
是否有更好的(例如更容易编码||更快||已经可用|| ...)解决此问题的方法?同样,我不受任何特定类型的数据库的约束。我是一名物理学家,拥有一定的计算机科学背景,所以对任何帮助表示赞赏。
答案 0 :(得分:2)
RDF stores完全符合您的本地需求。所以你的基本"架构"使用Turtle RDF格式的数据将如下所示:
# Prefixes
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://stackoverflow.com/q/48479002/database-design-for-non-homogeneous-data-with-history-of-values/>
:Foo rdf:type rdfs:Class .
:Bar rdfs:subClassOf :Foo .
:Bar_97 rdf:type :Foo .
:Bar_97 :prop1 "20141201" .
:Bar_97 :prop1 "20141202" .
:Bar_97 :prop1 "20141209" .
:Bar_97 :prop173 "Some interesting property" .
如您所见,您可以为同一属性分配多个值,即prop1
的{{1}}属性的值为Bar_97
,20141201
和{{1} }。
有关RDF商店的列表,请参阅RDF store implementations。要从Python访问RDF存储,您可以使用RDFlib。要确保RDFlib返回20141202
的所有子项(包括20141209
),请参阅RDFlib reasoning problem。
对于基于文件的RDF存储,存储通常存储为多个文件,以确保查询效率。但是,您应该能够将数据导出为Turtle(或其他一些人类可读的)格式。
最后一个观察结果是,RDF允许您根据明确说明的内容推断数据中未明确说明的信息。即从Foo
开始,它可以推断Bar
也是x rd:type :Foo
。但是,RDFlib不支持推理,因此RDFlib reasoning problem解决方法的原因可行,但是当您需要其他推理功能时,可能无法使用RDFlib进行寻址。我不知道实现推理的Python实现。因此,您可能需要考虑Jena或RDF4J等Java实现。