通常当你有一个带有自引用的表时,比如在树中,你有一个属性作为外键,它指向表的主键。 (就像文档中的 Adjacency List Relationships 示例一样)
但是,我有一个自然键,它是这样工作的: ""为根
- “a”、“b”、“c”等是“”的 child
- “aa”、“ab”、“ac”等是“a”的 child
- “ba”、“bb”、“bc”等是“b”的 child
- “aaa”、“aab”、“aac”等是“aa”的 child
所以树中每一层都有一个字符,每个节点的子节点都是首字母相同且加了一个字符的子节点。这称为“物化 key ”
在不添加额外属性来引用父级的情况下,如何使用 SQLAlchemy 映射器执行此操作?
注意:我只对读取关系感兴趣,如果像 node.children.append(child)
这样的东西不起作用也没关系。此外,我坚持使用 0.4.8 版,但是如果这在这个版本中是不可能的,但只能在较新的版本中实现,我可能会努力更新。
编辑 我在 SA mailinglist 上得到了第一个答案.它有效,但它不像我希望的那样基于映射器(例如使用 eagerload)
最佳答案
我确实理解问题的局限性,但您为什么要避免使用额外的 key ?当然,这是冗余信息,但取决于您的数据(行数、键的平均长度),拥有额外的键实际上可能会提高您在 SELECT
上的性能,并且您可以使用 eager -以最简单的方式加载 SA 中的关系。
例如,您可以执行以下操作:
- 添加另一个数字标识符作为 PK,并在此链接 child / parent 。
- 添加另一个字符串标识符以指向父对象(Key:Varchar,ParentKey:Varchar)。在某些 RDBMS(如 MSSQL)中,您可以有一个
PERSISTENT COMPUTED
列,这样您的客户端甚至不必提供父键,它将使用公式从 KEY 列自动计算(剪切最后一个字符)。在这种情况下,您在此列上有一个数据库索引和非常快速的关系检索。
关于python - SQLAlchemy 中的物化键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471687/