非同质数据的数据库设计,包含历史值

2024-04-23 15:30:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

说明

假设我们有一个FooBar对象的集合。每个都是属于它的Foos和Bars都可以具有无限数量的属性(属性)。不同的属性可以有不同的数据类型,可以是数字、文本、图像、文件等。此外,每个对象的每个属性都有值的历史记录,这些值必须存储在数据库中。你知道吗

我希望能够在不编辑数据库结构的情况下添加新属性。我不必使用任何特定的数据库软件,但我希望有一个Python接口,因为小组中的每个人都可以使用Python。最后,如果数据库是基于文件的,它会很有用。你知道吗

示例

这是一个更好地表示上述描述的图表。希望有帮助。你知道吗

example of data and data structure

我的尝试

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

database schema

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

问题终于来了

这个问题有没有更好的解决方案(例如,编码更容易、速度更快、已有的解决方案)?再说一次,我没有绑定到任何特定类型的数据库。我是一个物理学家,有一点计算机科学的背景,所以任何帮助都是感激的。你知道吗


Tags: 文件数据对象数据库类型内容sqlite属性
1条回答
网友
1楼 · 发布于 2024-04-23 15:30:29

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" .

如您所见,您可以将多个值赋给同一属性,即prop1Bar_97属性的值为201412012014120220141209。你知道吗

有关RDF存储的列表,请参见RDF store implementations。要从Python访问RDF存储,可以使用RDFlib。要确保RDFlib返回Foo(包括Bar)的所有子级,请参见RDFlib reasoning problem。你知道吗

对于基于文件的RDF存储,为了保证查询的效率,存储通常被存储为多个文件。但是,您应该能够将数据导出为Turtle(或其他一些人类可读的)格式。你知道吗

最后一个观察结果是,RDF允许您从已显式声明的信息中推断数据中未显式声明的信息。也就是说,从x rd:type :Foo可以推断x也是Bar。但是,RDFlib不支持推理,因此使用RDFlib reasoning problem解决方法是可行的,但是当您需要额外的推理能力时,使用RDFlib可能无法解决。我不知道实现推理的Python实现。因此,您可能需要考虑像JenaRDF4J这样的Java实现。你知道吗

相关问题 更多 >