【问题标题】:Where/how to store application defined properties about a (SQLite3) database in the database?在哪里/如何在数据库中存储有关(SQLite3)数据库的应用程序定义属性?
【发布时间】:2017-05-13 13:18:29
【问题描述】:

所以我有一个或多个包含各种数据表的数据库。

我需要存储一些特定于数据库的属性。 例如。被抓取网站的国家(该网站有多个国家)。

这样做的最佳方法是什么?我认为最好将属性保留在数据库中,但是(SQLite3)是拥有另一个表的唯一方法吗? (ID, Key, Value) 但是值可能需要是字符串/文本、整数、浮点数/实数。为了解决这个问题,我只需将它们全部转换为带有 json.dumps/loads 之类的字符串 或者这有更好的方法吗?

谢谢

【问题讨论】:

  • 添加的元数据是否会发生很大变化?您真的需要任意键值对吗,或者一个预定义的带有列的行就足够了?
  • 一旦添加,它们不太可能更改,但可能随时添加。
  • 您可以更新架构以添加列。
  • 通过列而不是行有什么优势?因为它只是让我更有意义地通过行来做。谢谢
  • 每一列都可以有一个与之关联的 SQL 类型,因此您可以自动获得正确的 Python 类型。

标签: python database sqlite


【解决方案1】:

因此,听起来您希望拥有与数据库相关联的字典之类的东西,您可以在其中存储有关应用程序如何与数据库交互的键值对信息。 有很多方法可以解决这个问题;我建议选择最适合您的应用程序的一种。

首先,假设您知道要使用的键,一个简单的方法是创建一个最多包含一行的表:

create table properties( country_of_website varchar(2) not null, time_downloaded timestamp not null);

我没有包含 id 列。根据您的 ORM 模型,您可能需要一个。您需要确保该表永远不会超过一行。这种方法很好,因为您依赖于数据库的类型。正如已经指出的 sqlite 使用动态类型,但有一天你可能会使用另一个数据库。如果您有少量属性并且您提前知道它们是什么,那么这种方法很有效。

另一方面,你可以做类似的事情

create table properties(key varchar(20) primary key, value varchar(256));

您有一个包含键和值的字符串表示形式的表。优点是它是相当动态的。缺点是您将使用属性的字符串表示形式。虽然这对 sqlite 来说并没有太大的劣势,但对于其他数据库,您可能会失去强类型检测编程错误的优势。

第三种方法是每个类型都有一个表。

create table float_properties(key varchar(20) primary key, value float not null);

并且还创建一个 string_properties 表等。由于动态类型,我建议不要使用 sqlite 这种方法。第三种方法是最复杂的,我只会在需要强类型且无法使用第一种方法时使用它。

【讨论】:

    【解决方案2】:

    SQLite 使用dynamic typing,因此您可以直接将属性值存储在列中。

    【讨论】:

    • 对每列使用 SQL 类型确实会自动为您提供正确的 Python 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2016-01-18
    • 2017-04-02
    相关资源
    最近更新 更多