【问题标题】:Materialized Key in SQLAlchemySQLAlchemy 中的物化键
【发布时间】:2014-05-07 20:44:52
【问题描述】:

通常当你有一个带有自引用的表时,比如在树中,你有一个属性作为外键,它指向表的主键。 (如文档中的Adjacency List Relationships 示例)

但是,我有一个自然键,它的工作方式如下: "" 是根

  • “a”、“b”、“c”等是“”的子代
  • “aa”、“ab”、“ac”等是“a”的子代
  • “ba”、“bb”、“bc”等都是“b”的子代
  • “aaa”、“aab”、“aac”等是“aa”的孩子

因此,树中的每一层都有一个字符,每个节点的子节点都是具有相同开头并添加一个字符的子节点。这称为“物化密钥”

在不添加额外属性来引用父级的情况下,如何使用 SQLAlchemy 映射器执行此操作?

注意:我只对阅读关系感兴趣,如果 node.children.append(child) 之类的东西不能正常工作。我也坚持使用 0.4.8 版本,但是如果在此版本中无法做到这一点,而只能在较新的版本中,我可能会努力更新。

编辑 我在SA mailinglist 上得到了第一个答案。它可以工作,但它不像我希望的那样基于映射器(例如使用 eagerload)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    我确实理解问题的限制,但您为什么要避免使用额外的密钥?当然,这是冗余信息,但取决于您的数据(行数、键的平均长度),拥有额外的键实际上可能会提高您在 SELECTs 上的性能,并且您将能够使用预先加载的关系在 SA 中以最简单的方式。

    例如,您可以执行以下操作:

    • 添加另一个数字标识符作为 PK 并将子/父链接到此。
    • 添加另一个字符串标识符以指向父对象(键:Varchar,ParentKey:Varchar)。在某些 RDBMS(如 MSSQL)中,您可以有一个 PERSISTENT COMPUTED 列,这样您的客户端甚至不必提供父键,它将使用公式自动从 KEY 列计算(剪切最后一个字符)。在这种情况下,您在此列上有一个数据库索引,并且关系检索速度非常快。

    【讨论】:

    • 嗯,我不想要这个的原因很大程度上是因为我认为它的效率会降低,而且我必须保存数十亿个实体。然而,计算密钥的想法可能是一个好主意。我必须看看我是否可以用 PostgreSQL 9 创建类似的东西。
    • 也许不是,但现在我必须忍受它;D
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 2022-01-15
    • 1970-01-01
    • 2011-09-30
    • 2021-11-11
    • 1970-01-01
    • 2018-02-27
    • 2014-04-21
    相关资源
    最近更新 更多