具有值历史的非同类数据的数据库设计

时间:2018-01-27 18:18:02

标签: python database schema

我正在设计一个数据库来保存科学研究项目的过去和未来数据。我试图通过删除所有与数据库无关的术语来简化讨论:)

描述

我们假设我们收集了 Foo Bar 对象。每个都是 Foo ,因为它属于它。 Foo Bar 都可以拥有无​​限数量的属性(属性)。不同的属性可以有不同的数据类型,可以是数字,文本,图像,文件等。此外,每个对象的每个属性都有一个值的历史记录,必须存储在数据库中。

我希望能够在不编辑数据库结构的情况下添加新属性。我没有被迫使用任何特定的数据库软件,但我希望有一个Python接口,因为该组中的每个人都可以使用Python。最后,如果数据库是基于文件的,那将非常有用。

实施例

这是一个更好地代表上述描述的图表。希望它有所帮助。

example of data and data structure

我的尝试

我决定尝试使用SQLite,以获得可通过Python轻松访问的基于文件的数据库。这是我采用的数据库模式:

database schema

我正在使用Python的sqlite3连接到它,pickle将不同类型的数据放在BLOB value列中。这种方法的缺点当然是SQLite不知道value内部的内容,因此我需要每次都检索所有内容以运行搜索,而我无法利用SQL查询。

问题,最后

是否有更好的(例如更容易编码||更快||已经可用|| ...)解决此问题的方法?同样,我不受任何特定类型的数据库的约束。我是一名物理学家,拥有一定的计算机科学背景,所以对任何帮助表示赞赏。

1 个答案:

答案 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_9720141201和{{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实现。因此,您可能需要考虑JenaRDF4J等Java实现。