避免EAV模型的最佳方法,但仍然允许灵活性

时间:2014-03-23 23:31:35

标签: java sql oracle csv groovy

我需要将CSV数据存储在Oracle数据库中,以便以后通过动态查询脚本进行检索。需要存储数据,以便可以使用SQL查询CSV数据的任何列,并且性能是关键(某些CSV文件是100k +行)。

CSV文件的内容(列数,标题,数据类型)是未知的,系统需要能够处理多个文件结构(添加到配置文件中,因此系统知道如何由不懂SQL的人阅读。

为了避免使用EAV模型,我目前的解决方案是每次将新的CSV结构添加到配置文件时让我的代码创建新表。我很想知道是否有更好的方法来实现我想要做的事情。我并不特别喜欢让我的代码在运行时在生产中创建新表。

系统是用groovy编写的,以防万一。

2 个答案:

答案 0 :(得分:2)

我倾向于使用您当前的解决方案,这是每种类型的单独表格。不知何故,我最适合将数据存储在定义明确的类型的明确定义的表中。

EAV(实体 - 属性 - 值)解决方案也是可行的。有了10万行数据,EAV解决方案应该表现得非常好,除非你有很多表。一个缺点是列的类型。没有太多额外的工作,你几乎只限于所有值的字符串。

Oracle确实提供了另一种可能性,即XML解决方案。这可以为您提供动态列名称的灵活性以及无需为每个列定义单独表格的“简单性”。您可以在文档here中阅读更多相关信息。

答案 1 :(得分:1)

归结为你想要建模的东西。如果您需要针对CSV文件中的任何列处理adhoc查询,那么我猜您需要将它们全部建模为Oracle列。如果您只需要根据特定键检索整行,那么您可以建模为两列:键和行。如果你需要对单个columsn进行建模,那么这样的东西就不会是第一种正常形式。

创建EAV模型时,您正在制作一个灵活的系统,允许轻松添加/删除其他列。 Oracle已经是一个灵活的系统,允许轻松添加/删除其他列。他们只是更加考虑您的天真EAV模型可能具有的锁定,性能,可扩展性和工具支持。

总的来说,我认为你可能做的最好。这不是一个简单的问题,并不是Oracle的设计目标,因此您可能会遇到统计问题以及要创建的索引等问题。

相关问题