我是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,但示例仅显示color
和dimensions
。 JSON字符串便于收集一组可变的属性(f-stop,着装大小,engine_cylinders,卡路里等),但对于其中的任何一个搜索都不方便。诸如颜色和大小之类的东西可能足够通用并且经过足够的搜索才能保证拥有自己的列。这是EAV compromise。
当两个表具有相同的PRIMARY KEY
(ean
)时,将它们保留为两个表几乎是不明智的。相反,通常最好制作一个表。
是的,在加载数据时,通常明智的做法是将其加载到临时表中,然后清理数据并移至其他表。
按照entity-attribute-value标记进行更多讨论。您可能会发现其他对您的项目有用的提示。