8

我是 hybris 的新手,什么是 diff b/w 关系和集合,为什么我们选择关系而不是集合。

4

10 回答 10

10

基本上,在 hybris 中建模集合有两种技术上不同的方法:

  1. 集合类型

    • 将 hybris 中的 CollectionTypes 视为安装在类型上的背包
    • 通过运行时,CollectionTypes 被解析为一种项目的 Collection,例如 MediaModel 的 List
    • 可能导致溢出,导致截断并因此丢失数据
    • 更难搜索和更低的性能
    • 在数据库级别,CollectionTypes 是一个逗号分隔的 PK 列表,因此有一个最大值
  2. 关系类型

    • 在各种类型之间创建链接创建类型安全的 n-to-m 关系:仅链接在关系中声明的源/目标类型的此类元素
    • 关系的值存储在单独的数据库表中+每个值都存储在单独的表行中
于 2016-05-15T15:02:27.187 回答
10

我完全同意@KilleKat 的评论,他提到了 Hybris 中 CollectionType 和 RelationType 之间的所有差异。

我在下面附上了一些图表,以便更清楚地了解该主题。

CollectionTypes:(要明智地使用) 在此处输入图像描述

关系类型:(推荐) 在此处输入图像描述

于 2017-01-27T00:59:21.890 回答
2

正如Sumit上面所说,

不鼓励使用 CollectionType,应尽可能使用 RelationType。这是因为 CollectionType 的数据库字段的最大长度是有限的,并且具有许多值的 CollectionType 最终可能会被截断其值。此外,CollectionTypes 的值是以 CSV 格式而不是以规范化的方式编写的。因此,hybris 建议尽可能使用 RelationTypes。

  • CollectionType: CollectionTypes 基于Java Collection 类,即Collection 是元素列表。
    1:n - 通过源项目上的属性(例如,主键列表)保持指向相应值的链接。
    n:1 - 将属性值存储在相应的目标项中,并在源类型中使用 getter 方法来检索值。
  • RelationType:
    n:m - 在内部,关系两侧的元素通过称为 LinkItem 的帮助器类型的实例链接在一起。LinkItems 包含两个属性,SourceItem 和 TargetItem,它们包含对相应项目的引用。

对于关系中的每个条目(换句话说,对于从一个项目到另一个项目的每个链接),都有一个 LinkItem 实例来存储相关项目的 PK。LinkItem 实例由平台透明且自动地处理:在 API 级别上,您只需要使用各自的 getter 和 setter 方法。

于 2016-05-11T11:48:58.030 回答
1

理解 hybris 很重要,强烈反对使用集合,而是使用关系。

如上所述,集合被维护为与数据结构预期分隔的逗号,这就是为什么您可能会看到数据截断问题的原因,因为关系具有创建新表和映射表以连接两个表的合理数据结构。

由于存在存储结构的集合 - 无法搜索。

我会说一个非常简单的(1:n)关系与有限的数据 - 你仍然可以使用集合。而对于任何复杂的 (m:n /1:n) 关系,总是使用关系

于 2015-09-28T15:24:44.533 回答
0

在集合中,我们的大小有限,如果我们试图插入更多数据,它将被截断。我们可以使用 n 没有的关系。数据的。

集合比关系快,但是在集合中我们只能使用一对多关系,对于多对多我们应该只使用关系......

于 2015-02-12T09:19:41.190 回答
0

一对多关系可以通过Collection和relation来实现

为什么在某些情况下收集比 Hybris 中的关系更受欢迎

集合- 一对多关系的替代方案

示例用户和地址

这里的 Address 是 Collection 类型,并作为 AddressCollection 映射到 User。用户必须需要一个地址对象,但对于地址来说,没有必要有 UserModel 引用(一个用户可以有很多地址)。这就是为什么集合比关系更受欢迎的原因。

<collectiontype code="AddressCollection" elementtype="Address" autocreate="true" generate="false"/>

<itemtype code="User"
              extends="Principal"
              jaloclass="de.hybris.platform.jalo.user.User"
              autocreate="true"
              generate="true">
        <deployment table="Users" typecode="4" propertytable="UserProps"/>
        <attributes>
           <attribute autocreate="true" qualifier="addresses" type="AddressCollection">
             <modifiers read="true" write="true" search="false" optional="true" partof="true"/>
             <persistence type="jalo"/>
           </attribute>
        </attributes>
    </itemtype>

关系- 一对多

示例用户和订单

在这里,一位用户可以下达任意数量的订单!用户需要 OrderModel 引用,对于 OrderModel ,它需要 UserModel 对象引用。将创建一个双向链接。

<relation code="User2Orders" generate="true" localized="false" autocreate="true">
        <sourceElement type="User" cardinality="one" qualifier="user">
            <modifiers read="true" write="true" search="true" optional="false"/>
        </sourceElement>
        <targetElement type="Order" cardinality="many" qualifier="orders">
            <modifiers read="true" write="true" search="true" optional="true" partof="true"/>
        </targetElement>
    </relation>
于 2021-03-22T18:11:52.553 回答
0

集合 集合层次结构中的根接口。

Collection 表示一组对象,称为它的元素。

一些集合允许重复元素,而其他集合不允许。

有些是有序的,有些是无序的

要真正了解每个集合的优点及其性能特征,我建议您了解数据结构,如数组、链表、二叉搜索树、哈希表以及堆栈和队列。如果您想成为任何语言的有效程序员,真的没有什么可以替代学习这一点的。

HashMap 仅用于有某种逻辑原因需要具有与值对应的特殊键的情况

于 2015-10-25T05:01:13.820 回答
0

除了 Raghav 添加的内容之外,内部集合作为 PK 的 csv 存储在单个列中。因此,由于任何数据库中的字段长度限制,都会出现大小限制。

然而,关系可以存储在单独的表中,因此可以进行无限映射。

于 2015-09-09T04:25:07.743 回答
0

hybris中Collection和Relationship之间的确切区别是:

“数据如何存储在两者中”

在集合中,在 table(item) 中创建一个新列,其中包含列表元素的逗号分隔主键。实际的列表元素存储在另一个表中。

在关系中,将创建一个新表作为两个项目类型之间的链接表。

您可以在此处阅读完整的区别。

于 2020-11-20T22:48:14.077 回答
0

集合作为序列化对象保存在数据库的单个列中。

关系以通常的关系数据库方式持久化 - 在另一个表或链接表上使用外键(取决于关系的基数)

不鼓励使用集合类型,因为它们无法使用灵活搜索进行搜索,并且在处理多个对象的集合时具有显着的性能限制。

于 2016-03-11T16:07:32.447 回答