hybris中关系和集合之间的区别?

时间:2015-01-30 06:59:48

标签: hybris

我是hybris的新手,什么是差异关系和收藏,为什么我们选择关系而不是收藏。

10 个答案:

答案 0 :(得分:9)

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

  1. CollectionTypes

    • 将hybris中的CollectionTypes视为安装在类型
    • 上的背包
    • 通过运行时,CollectionTypes被解析为一种项目的集合,例如媒体模型列表
    • 可能导致溢出,导致截断,从而导致数据丢失
    • 更难搜索和降低性能
    • 在数据库级别,CollectionTypes是以逗号分隔的PK列表,因此存在最大值
  2. RelationTypes

    • 在各种类型之间创建链接创建类型安全的n到m关系:仅链接在关系中声明的源/目标类型的元素
    • 关系的值存储在单独的数据库表中 +每个值都存储在一个单独的表行中

答案 1 :(得分:9)

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

我附上了一些图表,以便更清楚地了解这个主题。

CollectionTypes:(明智地使用) enter image description here

RelationTypes:(推荐) enter image description here

答案 2 :(得分:1)

了解hybris非常重视阻止使用集合,而是使用关系。

如上所述,集合被保持为逗号与数据结构前瞻性分离,这就是为什么你可能会看到数据截断的问题,其中关系具有创建新表的合理数据结构和映射表以加入两个表。 / p>

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

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

答案 3 :(得分:1)

正如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方法。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

添加Raghav添加的内容,内部集合作为PK的csv存储在单个列中。因此,由于任何数据库中的字段长度限制而导致大小限制。

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

答案 6 :(得分:0)

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

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

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

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

为了更好地了解每个集合的优点及其性能特征,我建议您对数据结构(如数组,链接列表,二进制搜索树,Hashtables以及堆栈和队列)有一个很好的了解。如果你想成为任何语言的有效程序员,那么学习它是没有任何替代的。

HashMap仅用于存在某些逻辑上需要具有与值

对应的特殊键的情况

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

集合和关系之间的确切区别是:

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

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

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

您可以阅读完整的差异here

答案 9 :(得分: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>