【发布时间】:2015-06-08 04:25:24
【问题描述】:
我想在我的表“Store”中存储 String[] 标签。一个商店实体可以有多个标签,我看不出有任何理由创建任何映射“store_tags”表。
所有相关标签都应存储在“存储”表中。从我可以在 Internet 上搜索的内容看来,JPA/Hibernate @ElementCollection 注释可以做到这一点,但它需要集合映射表。
是否可以通过hibernate在postgresql表中以String[]的形式存储和检索数据,而无需创建任何此类映射表?
另外,如果那不可能,将字符串列表连接成一个字符串并将其存储在表中,是可以接受的设计吗?或者会不会有什么不好的后果?请举几个例子/点,这些选项将来可能会导致问题。
我正在使用 Java Play Framework、Hibernate 和 PostgreSQL。
【问题讨论】:
-
您可以按照自己的建议使用分隔列表。当您存储和检索列表时,您必须编写逻辑来构建和拆分列表,恭敬地。如果列表可能很大,一个缺点可能是您会丢失延迟加载。您也可能无法在数据库级别强制执行唯一性(需要在代码中完成)。你试过这种方法吗?
-
@SaadShakil 不,我没有尝试过,想知道这种方法的优缺点,然后再实施。我的列表不会超过 100 个单词,所以我认为延迟初始化不会成为我的问题。感谢您的及时回复!
-
使用表格的目的是使您的数据可搜索:例如,查找具有给定标签或具有给定标签集的商店。使用正确的数据库设计,而不是自取其辱。
-
@JBNizet 我完全同意你的观点,我不明白为什么我不能通过 JPA 将集合存储在 DB 中,而不使用映射表。我认为在很多情况下映射表是无关紧要的,使用它会导致数据冗余和查询速度变慢。如果假设我必须首先根据位置过滤商店,然后根据标签过滤它。然后在“存储”表中添加标签会提高查询速度,而不是将数据与映射表连接起来。恕我直言,即使我将其存储在逗号分隔的单个字符串中,使用 LIKE 命令查询此子结果也会快得多。
-
不,不会。 join 比 like 查询更有效,like 查询不能使用任何索引,因此需要完全扫描。而且我什至不是在谈论逗号是标签名称的一部分,因此必须被转义的情况。或者标签是其他标签的子字符串的情况等。将标签存储在单独的表中将避免冗余:而不是一次又一次地存储长标签名称,您将它们存储一次,在一个单独的表中行,并通过他们的数字 ID 引用他们。
标签: java hibernate postgresql jpa playframework-2.0