python - 具有值历史的非同质数据的数据库设计

标签 python database schema

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

描述

假设我们有一个 FooBar 对象的集合。每个 Bar 都是 Foo,从某种意义上说,它属于它。 FooBar 都可以拥有无​​限数量的属性(特性)。不同的属性可以有不同的数据类型,可以是数字、文本、图像、文件等。此外,每个对象的每个属性都有一个历史值,必须存储在数据库中。

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

例子

这是一个图表,可以更好地表示上面的描述。希望对您有所帮助。

example of data and data structure

我的尝试

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

database schema

我正在使用 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_97prop1 属性的值为 201412012014120220141209

有关 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/

相关文章:

python - __str__(self) 和 show(self) 之间的区别

python - 如何使用 Python 将数组从球面坐标插值到笛卡尔坐标?

mysql - 数据库设计 SQL - 在编辑期间插入复选框值

pyspark - 创建涉及 ArrayType 的 Pyspark 架构

sql-server-2005 - 如何在存储过程中查找数据表列引用

database - 联系人管理系统架构

python - 绘图平滑 matplotlib 和 seaborn

python - 如何创建在 matplotlib.pyplot.step(x,y) 中绘制的 numpy 阶梯数组(相当于 Matlab 的楼梯)

mysql - SQL - 表在不同时间点具有不同的值 - 最佳实践?

PHP MYSQL 分页列出所有字段