首页 > 解决方案 > 如何将数据从一个表移动到 MySQL (MariaDB) 中的 EAV 结构中

问题描述

我是 php/mysql 的新手,作为我自己学习编程的项目,我正在尝试在 Xampp 上的 php 中创建一种价格比较引擎。

目前我正在处理导入端。我想将商家提要导入 EAV 设计的数据库(Mariadb)。我正在尝试将数据从临时(tmp)表移动到其他 3 个表。商家提要数据已加载到“tmp”中,需要移动到其他表中。

我所拥有的是:

tmp(临时转储 csv 文件)

tmp.ean

tmp.isbn

tmp.color

tmp.dimensions

tmp.image

tmp.upc

tmp.price

tmp.stock

tmp.merchant

t1(基本产品信息表)

t1.ean (unique)

t1.isbn

t1.upc

t2(价格和库存表)

t2.ean (FK)

t2.price

t2.stock

t2.merchant

t3(属性表)

t3.ean (FK)

t3.color

t3.dimensions

t3.image

目前我有填写 t1 的代码

用来自 tmp 的数据填充 t1

1)我首先将 ean 列从 tmp.ean 复制到 t1.ean 以添加新产品。2) 在第二次运行时,我用 tmp 表中的数据填充 t1.isbn 和 t1.upc 列,其中 tmp.ean = t1.ean。这部分有效,独特的产品被添加到 t1 表中。

我想要做的也是将数据添加到 T2 和 T3,在这些表中 ean 不是唯一的,因为每个 ean 可以有更多的属性,每个 ean 可以有更多的价格(商家)我想做如下:

更新 t2 中的价格/库存:

1) 将 tmp.ean 添加到不存在 EAN 和 Merchant 的 t2.ean。因此,当没有具有该 ean 和商家 ID 的 ean 时添加 ean 2) 将 tmp.stock tmp.price 添加到 t2.stock t2.price 其中 tmp.ean = t2.ean AND tmp.Merchant 是 t2.merchant

更新 t3 中的属性:

1) 将 tmp.ean 添加到不存在 EAN 和 t3.color(实体)的 t3.ean。因此,当没有具有该属性(颜色)的 ean 时添加 ean 2)将 tmp.color(值)添加到 t3.color 其中 tmp.ean = t3.ean AND tmp.color = t3.color

我在正确的道路上吗?还是我让事情变得太复杂了,有没有更简单/更快的方法来做到这一点,最好使用哪些 sql 查询命令,UPDATE、INSERT、JOIN?可能有数百万种产品和许多进口,因此速度将成为一个问题。

标签: phpmysqlcsvmariadbentity-attribute-value

解决方案


MariaDB 的动态列是 JSON 的前身,它现在存在于MySQL 和 MariaDB的最新版本中。

您暗示您正在获得 EAV,但您的示例仅显示colordimensions. JSON 字符串可以方便地收集一组可变属性(f-stop、着装尺寸、engine_cylinders、卡路里……),但对于搜索其中的任何一个都不是很方便颜色和大小之类的东西可能足够通用,并且搜索到足以保证拥有自己的列。这就是 EAV妥协

当两个表具有相同 PRIMARY KEY的( ean) 时,将它们保留为两个表很少是明智的。相反,通常最好制作一个表。

是的,在加载数据时,通常明智的做法是加载到临时表中,然后清理数据并移动到其他表。

关注标签进行更多讨论。您可能会发现对您的项目有用的其他提示。


推荐阅读