【问题标题】:How to reference self entities with Breeze.js如何使用 Breeze.js 引用自身实体
【发布时间】:2014-11-29 18:44:20
【问题描述】:

我在我的一个项目中使用了微风.js,我想绘制一张 selft 相关数据的图表。 元数据的定义是手工完成的。 我的实体引用了 2 种类型(父母和子猫),它们都是实体本身的 id 数组。

我的第一次尝试是构建我的客户端 metadataStore,如下所示:

function addTransactionCategory() {
        addType({
            name: 'Category',
            dataProperties: {
                id: {type: ID},
                name: {max: 400, nullOk: false},
                description: {max: 400},
                parents: {max: 400}, // This is not correct
                subcats: {max: 400} // This is not correct
            },
            navigationProperties: {
                parents: {type: 'Category', hasMany: true},
                subcats: {type: 'Category', hasMany: true}
            }
        });
    }

这里是 JSON 数据的示例

{
    _id: 117,
    name: "Utilities",
    description: "Example of entity",
    subcats: [
       118,
       119,
       120,
       121,
       122,
       123,
       124,
       125
    ],
    parents: [ ]
 }

知道 navigationProperties 抛出错误,我应该如何在 Breeze 中实现这种类型的关系。我的后端是 MongoDb,我不想复制信息,这就是我使用这个数据模式逻辑的原因。


根据@ward 的评论,我想详细说明一下模型的结构。

从给定的类别中,我希望能够检索附加到该类别的所有父类别(级别 x - 1),并且我希望能够检索子类别(级别 x+1)。

这是一张图片,左侧显示了一个关系示例。 右边是表结构,如果结构是用 SQL 设计的。
example of the entity and SQL tables http://imageshack.com/a/img909/6914/ogeirV.png

这个例子展示了一个层次的关系。主要思想是建立多层次的关系。

一个类别可以有 0 或 n 个子类别/父类别 一个子类别可以有 0 或 n 个父/子类别 这种结构允许多层次的深层结构 例如。猫 A → 猫 A A → 猫 A A A → 猫 A A A A ...

提前感谢您的帮助。

【问题讨论】:

    标签: angularjs breeze


    【解决方案1】:

    MongoDb 不支持实体之间的关系。

    微风可以。但恐怕你离弥合差距还很远。

    自引用类型示例

    DocCode 中的Employee 是自引用EntityType 的示例。一名员工可以有一名经理员工(父母)和许多直接下属员工(子女)。

    您可以在 Northwind DocCode 测试之一中设置断点,通过 entityManager.metadataStore.getEntityType('Employee') 提取 Employee 类型,并检查该类型的数据和导航属性以了解关系的结构。

    您会发现每个 Employee 的 Manager 属性都由 ReportsToEmployeeID FK 属性支持。这与员工有一个经理的想法是一致的。 Breeze 使用此 FK 来维护缓存中所有员工的 ManagerDirectReports 属性。

    请注意,当员工是“经理”时,它有一个“直接下属”导航,但它不维护这些直接下属员工的 ID 列表。它依赖于能够根据直接下属员工中的 FK 重构 DirectReportsarray 的内容。

    现在将其与您正在做的事情进行比较。

    类别有多个父类

    类别有多个父级?真的吗?你确定你的模型是这样的

    这意味着父类别和子类别之间存在多对多的关系。抱歉,Breeze 不支持多对多。您需要中间映射实体来表示 Parent_Child 连接。在您有机会澄清之前,我将暂缓探索这种可能性。

    Category 父级保存其子级的 id

    Category.subcats 属性是一个 ID 数组。这意味着您希望父级持有对子级的引用,而不是让子级持有对父级的引用(正如 Employee 所做的那样,ReportsToEmployeeID 是对经理父级的引用)。

    抱歉,Breeze 没有设置为以这种方式工作。

    明白你为什么要以这种方式存储数据。 Mongo 是非关系型的。要查找类别 X 的子类别,您认为您不想在 Mongo 数据库中搜索 ParentIDX._id 的所有类别。

    但是现在这些“subcat”ID 对您有什么好处?你不能直接对它们做任何事情......除非所有 Category 实例都在缓存中。

    如果您不能指望缓存中的所有类别,则必须使用列出子目录 ID 的查询来检索“子目录”。有两个问题:(1)它比“ParentID 等于 X._id”的查询更困难,(2)维护这个 subcat 数组比维护子类别上的 FK 困难得多.想一想当您将一个类别从一个父类别重新分配到另一个类别时必须做什么。那是两个更新操作,它们不能在事务中!

    结论

    我认为,在弄清楚如何在 Breeze 中设置导航属性之前,首先需要更好地处理您的模型以及您打算如何维护和使用这些关系

    【讨论】:

    • 感谢您的回复。你所有的cmets都很有意义。请查看我的编辑,也许我试图实施的逻辑会更有意义。在 Mongo 中放置的理想结构是什么,以便能够支持多层次的层次结构,当然还可以使用微风,因为这个工具太棒了!
    猜你喜欢
    • 2014-01-29
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多