SQLAlchemy中的物化键

时间:2011-03-29 11:21:02

标签: python sqlalchemy

通常当你有一个带有selfrefernece的表时,比如在树中,你有一个属性作为外键,它指向表的主键。 (比如文档中的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)

1 个答案:

答案 0 :(得分:1)

我确实理解了这个问题的约束,但你为什么要避免使用额外的密钥呢?当然,它是冗余信息,但根据您的数据(行数,密钥的平均长度),拥有额外的密钥实际上可能会提高您在SELECT上的性能,并且您可以使用eager-loading SA中的关系以最微不足道的方式。

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

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