hybris中的关系和集合之间的区别?
Posted
技术标签:
【中文标题】hybris中的关系和集合之间的区别?【英文标题】:Difference between relations and collections in hybris? 【发布时间】:2015-03-29 15:03:01 【问题描述】:我是 hybris 的新手,什么是 diff b/w 关系和集合,为什么我们选择关系而不是集合。
【问题讨论】:
你能把问题标记为已回答吗? 【参考方案1】:在集合中,我们的大小有限,如果我们试图插入更多数据,它将被截断。 我们可以使用 n 没有的关系。数据。
集合比关系快,但是在集合中我们只能使用一对多关系,对于多对多我们应该只使用关系....
【讨论】:
【参考方案2】:除了 Raghav 添加的内容外,内部集合作为 PK 的 csv 存储在单个列中。因此,由于任何数据库中的字段长度限制,都会出现大小限制。
但是,关系可以存储在单独的表中,因此可以进行无限映射。
【讨论】:
【参考方案3】:理解 hybris 很重要,强烈建议不要使用集合,而是使用关系。
如上所述,集合被维护为逗号分隔的数据结构,这就是为什么您可能会看到数据截断问题,因为关系具有创建新表和映射表以连接两个表的合理数据结构。
由于存在存储结构而收集 - 无法搜索。
我会说一个非常简单的 (1:n) 关系与有限的数据 - 你仍然可以使用集合。而对于任何复杂的 (m:n /1:n) 关系,总是使用关系
【讨论】:
【参考方案4】:集合 集合层次结构中的根接口。
集合表示一组对象,称为它的元素。
有些集合允许重复元素,而有些则不允许。
有些是有序的,有些是无序的
要真正了解每个集合的优点及其性能特征,我建议您了解数据结构,如数组、链接列表、二叉搜索树、哈希表以及堆栈和队列。如果您想成为任何语言的高效程序员,那么学习这一点真的无可替代。
HashMap 仅在出于某种逻辑原因需要具有与值对应的特殊键的情况下才真正使用
【讨论】:
【参考方案5】:集合作为序列化对象保存在数据库的单个列中。
关系以通常的关系数据库方式持久化 - 在另一个表或链接表上使用外键(取决于关系的基数)
不鼓励使用集合类型,因为它们无法使用灵活搜索进行搜索,并且在处理多个对象的集合时具有显着的性能限制。
【讨论】:
【参考方案6】:正如 Sumit 上面所说,
不鼓励使用CollectionType,应尽可能使用RelationType。这是因为 CollectionType 的数据库字段的最大长度是有限的,并且具有许多值的 CollectionType 最终可能会被截断其值。此外,CollectionTypes 的值是以 CSV 格式而不是以规范化的方式编写的。因此,hybris 建议尽可能使用 RelationTypes。
CollectionType: CollectionTypes 基于 Java Collection 类,即 Collection 是元素列表。1:n - 通过 on 的属性保持指向各个值的链接源项,例如,主键列表。n:1 - 将属性值存储在相应的目标项中,并在源类型中使用 getter 方法来检索值。 RelationType:n:m - 在内部,关系两侧的元素通过称为 LinkItem 的辅助类型实例链接在一起。 LinkItems 包含两个属性,SourceItem 和 TargetItem,它们包含 对相应项目的引用。对于关系中的每个条目(换句话说,对于从一个项目到另一个项目的每个链接),都有一个 LinkItem 实例来存储相关项目的 PK。 LinkItem 实例由平台透明自动处理:在 API 级别,您只需要使用各自的 getter 和 setter 方法。
【讨论】:
【参考方案7】:基本上,在 hybris 中有两种技术上不同的集合建模方式:
集合类型
将 hybris 中的 CollectionTypes 视为安装在类型上的背包 在运行时,CollectionTypes 被解析为一种项目的 Collection,例如 MediaModel 的 List 可能导致溢出,从而导致截断并因此丢失数据 更难搜索且性能更低 在数据库级别,CollectionTypes 是一个以逗号分隔的 PK 列表,因此有一个最大值关系类型
在各种类型之间创建链接创建类型安全的 n-to-m 关系:仅链接在关系中声明的源/目标类型的此类元素 关系的值存储在单独的数据库表中 +每个值都存储在单独的表格行中【讨论】:
我不认为 CollectionTypes 存储为逗号分隔的 PK 列表(除非最近发生了变化)。当我看过它们时,它们只是序列化的 java pojo,写成 BLOB。也许它只是对简单类型的集合这样做......? @kabadisha 是的,它们存储为逗号分隔的列表。试一试,看看数据库,你会看到它【参考方案8】:我完全同意@KilleKat 的评论,他提到了 Hybris 中 CollectionType 和 RelationType 之间的所有区别。
我附上了一些图表,以便更清楚地了解该主题。
CollectionTypes:(要明智地使用)
关系类型:(推荐)
【讨论】:
【参考方案9】:hybris中Collection和Relationship的确切区别是:
“数据如何存储在两者中”
在集合中,在 table(item) 中创建一个新列,其中包含列表元素的逗号分隔主键。实际的列表元素存储在另一个表中。
在关系中,创建一个新表作为两个项目类型之间的链接表。
您可以阅读完整的区别here。
【讨论】:
【参考方案10】:可以通过Collection和relationand实现一对多关系
为什么在某些情况下收集比 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>
【讨论】:
以上是关于hybris中的关系和集合之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章