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

目前,我正在导入端。我想将商家提要导入到EAV设计的数据库(Mariadb)中。我正在尝试将数据从临时(tmp)表移动到其他3个表。商家Feed数据已加载到“ 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
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和tmp.color = t3.color

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

最佳答案

MariaDB的Dynamic Columns是JSON的前身,而JSON现在存在于MySQL和MariaDB的最新版本中。

您暗示要获得EAV,但示例仅显示colordimensions。 JSON字符串便于收集一组可变的属性(f-stop,着装大小,engine_cylinders,卡路里等),但对于其中的任何一个搜索都不方便。诸如颜色和​​大小之类的东西可能足够通用并且经过足够的搜索才能保证拥有自己的列。这是EAV compromise

当两个表具有相同的PRIMARY KEYean)时,将它们保留为两个表几乎是不明智的。相反,通常最好制作一个表。

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

按照entity-attribute-value标记进行更多讨论。您可能会发现其他对您的项目有用的提示。

09-30 09:27