php - 如何将数据从一个表移动到 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?可能有数百万种产品和许多进口,因此速度将成为一个问题。
解决方案
MariaDB 的动态列是 JSON 的前身,它现在存在于MySQL 和 MariaDB的最新版本中。
您暗示您正在获得 EAV,但您的示例仅显示color
和dimensions
. JSON 字符串可以方便地收集一组可变属性(f-stop、着装尺寸、engine_cylinders、卡路里……),但对于搜索其中的任何一个都不是很方便。颜色和大小之类的东西可能足够通用,并且搜索到足以保证拥有自己的列。这就是 EAV妥协。
当两个表具有相同 PRIMARY KEY
的( ean
) 时,将它们保留为两个表很少是明智的。相反,通常最好制作一个表。
是的,在加载数据时,通常明智的做法是加载到临时表中,然后清理数据并移动到其他表。
关注entity-attribute-value标签进行更多讨论。您可能会发现对您的项目有用的其他提示。
推荐阅读
- python - 无法在视图中设置 Django 表单的字段值
- nginx - 如何为页面名称几乎相同的页面编写 nginx 重定向规则
- javascript - 将嵌套数组转换为具有嵌套对象的数组
- java - SpringBoot SS:L 密钥库密码不正确
- sql - 在 SQL 中,如何获取一个长字符串并将 & 符号之间的所有内容解析为新列?
- php - 有两个缓存控制头
- javascript - 赛普拉斯如何从 then 函数内部设置全局变量
- reactjs - 为什么来自 API 的 Json 没有在表格上呈现
- angular - GA4 - Angular - Google Analytics 4 - 个性化页面路径指标
- parameters - Cloudformation - 将参数传递到二级堆栈