在使用 E-A-V 表获取动态属性的系统中插入与加载数据

Posted

技术标签:

【中文标题】在使用 E-A-V 表获取动态属性的系统中插入与加载数据【英文标题】:INSERT vs LOAD DATA in a system using E-A-V table for dynamic attributes 【发布时间】:2011-06-17 15:54:40 【问题描述】:

我有一个旧的 php Web 应用程序,它执行 csv --> 数据库导入,进入一个存储实体数据的“主”表,以及一个存储每个实体的动态数据的实体属性值表。

导入过程是对 csv 文件的逐行迭代,每行在主表中插入一个 INSERT,在 EAV 表中插入多个。

这个过程很慢,对mysql调优知之甚少的告诉我,一个LOAD DATA语句一般比一系列INSERT快得多;然而,由于 EAV 过程,迭代仍然必须发生,尽管基于数据库查询的结果而不是 csv 文件。

值得修改吗?

如果每个文件中有数千万条记录,通常只有不到 2/3 的文件字段实际映射到属性,这会有所不同吗?

【问题讨论】:

【参考方案1】:

听起来像是一个有用的修改。我要做的是将 CSV 预处理成两个文件 - 主表和 eav 表。棘手的部分是在这两个文件之间建立某种链接,以便您可以使用正确的外键插入 eav 表。

如果满足以下条件,问题就简化了:

    您可以在执行加载时锁定对系统的任何其他写访问权限 主表主键是递增整数

在这种情况下,您可以轻松地提前“了解” eav 外键值,并在为任一表加载数据之前进行适当设置。

如果没有,您将需要弄清楚如何获取主表记录的主键值,发布 LOAD DATA,并相应地与 eav 记录链接。

【讨论】:

以上是关于在使用 E-A-V 表获取动态属性的系统中插入与加载数据的主要内容,如果未能解决你的问题,请参考以下文章

动态插入语句需要返回插入的ID

Hive 动态分区

怎么用图表控件FineReport做图表

LINQ 2 DB 动态插入表

动态创建的元素怎么做动画

在属性标签上获取动态类型