我正在设计一个数据库来保存科学研究项目过去和 future 的数据。我试图通过删除所有与数据库无关的术语来简化讨论:)
描述
假设我们有一个 Foo 和 Bar 对象的集合。每个 Bar 都是 Foo 的子,从某种意义上说,它属于它。 Foo 和 Bar 都可以拥有无限数量的属性(特性)。不同的属性可以有不同的数据类型,可以是数字、文本、图像、文件等。此外,每个对象的每个属性都有一个历史值,必须存储在数据库中。
我希望能够在不编辑数据库结构的情况下添加新属性。我没有被迫使用任何特定的数据库软件,但我希望有一个 Python 接口(interface),因为小组中的每个人都可以使用 Python。最后,如果数据库是基于文件的,这将很有用。
例子
这是一个图表,可以更好地表示上面的描述。希望对您有所帮助。
我的尝试
我决定尝试使用 SQLite,以获得可以使用 Python 轻松访问的基于文件的数据库。这是我采用的数据库架构:
我正在使用 Python 的 sqlite3
连接到它,并使用 pickle
将不同类型的数据放入 BLOB value
列中。这种方法的缺点当然是 SQLite 不知道 value
里面有什么,因此我每次都需要检索所有内容来运行搜索,而且我无法利用 SQL 查询。
最后的问题
是否有更好的(例如更容易编码 || 更快 || 已经可用 || ...)的解决方案来解决这个问题?同样,我不受任何特定类型的数据库的约束。我是一名物理学家,具有一点计算机科学背景,因此非常感谢您的帮助。
最佳答案
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" .
如您所见,您可以为同一属性分配多个值,即 Bar_97
的 prop1
属性的值为 20141201
,20141202
和 20141209
。
有关 RDF 商店的列表,请参阅 RDF store implementations .要从 Python 访问 RDF 存储,您可以使用 RDFlib .要确保 RDFlib 返回 Foo
(包括 Bar
)的所有子项,请参阅 RDFlib reasoning problem .
对于基于文件的RDF存储,为了保证查询效率,存储往往存储为多个文件。但是,您应该能够将数据导出为 Turtle(或其他一些人类可读的)格式。
最后一个观察结果是,RDF 允许您从数据中明确陈述的信息中推断出未明确陈述的信息。 IE。从 x rd:type :Foo
可以推断出 x
也是一个 Bar
。但是,RDFlib 不支持推理,因此是 RDFlib reasoning problem 的原因解决方法,可行,但当您可能需要额外的推理能力时,使用 RDFlib 可能无法解决。我不知道实现推理的 Python 实现。出于这个原因,您可能需要考虑像 Jena 这样的 Java 实现。或 RDF4J .
关于python - 具有值历史的非同质数据的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479002/