【问题标题】:How can I model a binary tree in Core Data?如何在 Core Data 中建模二叉树?
【发布时间】:2020-12-01 19:42:10
【问题描述】:

我目前有一个具有两个关系的实体:leftChildrightChild

Node:
    leftChild: Node (no inverse)
    rightChild: Node (no inverse)

现在我希望每个节点都有一个parent,并将其设置为两个孩子的逆:

Node:
    leftChild: Node (`parent` is inverse)
    rightChild: Node (`parent` is inverse)
    parent: Node

问题是,Core Data 似乎不喜欢将parent 作为两个关系的倒数。但是当然 leftChild 和 rightChild 将有相同的父级。所以我最终得到了这个不满意的结果:

Node:
    leftChild: Node (`leftParent` is inverse)
    rightChild: Node (`rightParent` is inverse)
    leftParent: Node
    rightParent: Node

但是“leftParent”和“rightParent”没有意义,因为只有一个父母。有没有更好的建模方法?

【问题讨论】:

  • 如果您向节点添加偏向感(左/右),您的模型是否会中断,因为从父级到子级的一对多关系将处理拆分,并且从那里左或右节点是一个过滤掉。
  • 为了确保我理解@WarrenBurton,你说的是而不是leftChild和rightChild,我应该只有children是一个孩子数组,并假设这个数组只有2个孩子?

标签: ios swift core-data


【解决方案1】:

将父母与孩子的关系建模为to-many,将孩子与父母的关系建模为to-one

如果您的节点带有偏向感,例如isLeft: Bool,则可以通过过滤器或谓词产生左右节点。

extension Node {
    var leftNode: Node? {
        return (children as? Set<Node>)?
            .filter({ $0.isLeft })
            .first
    }

    var rightNode: Node? {
        return (children as? Set<Node>)?
            .filter({ !$0.isLeft })
            .first
    }
}

其他建议,例如为to-many 关系使用有序集也可能更适合您的用例。

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 2010-10-24
    • 2023-03-25
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多