我在mySQL数据库中有两个表:
人:
id name address .....
和项目:
id person_id param1 param2 ....
项目由person_id引用为人员。大约有5000人和40,000件物品并且还在增长。这些数据需要每隔几天从大XML文件更新,如下所示:
.....
<person id='100016' lastname='....' firstname='.....' .... >
<item param1='...' startdate='2006-01-07' enddate='2006-12-09' ... />
<item param1='...' startdate='2007-01-04' enddate='2007-12-08' ... />
<item param1='...' startdate='2008-01-04' enddate='2009-01-03' ... />
<item param1='...' startdate='2009-01-06' enddate='2009-12-31' ... />
</person>
......
人和物品的某些属性可以更改,可以添加新人和新物品。
什么是让它更容易更新的最佳方式?我认为截断表并重新加载它们并不是最有效的方法。我应该考虑一些暂存 - 大小的XML文件开始具有60MB的意义并且正在增长 - &gt;将它解析为SimpleXML并与SQL进行比较无效...
在这种情况下最佳做法是什么?
我将mynd和PHP与Zend Framework作为我的环境
答案 0 :(得分:1)
您可以在旧的和新的XML文件上使用diffxml,然后解析XML中的更改以将它们反映到MySQL中。
但我认为截断并加载完整文件也可以在合理的时间内完成。有时这种简单的解决方案是最好的 - 即使它不是超快的。
答案 1 :(得分:0)
问题1 - 保持更新易用的最佳方法是什么?
您是否可以在XML中使用唯一引用?如果是,则导入此数据并使用它来确定是否已导入XML数据。否则你必须自己生成引用。
在XML中使用此引用将是完美的,因为您可以使用DOMDocument加载XML文档,然后使用XPath轻松转到上次导入的引用,然后再次导入。只有当您知道以前的行不会更改数据时,这才有效。
如果确实发生了变化,那么您需要对其进行迭代或使用Alex建议的差异工具。
答案 2 :(得分:0)
我认为最有效的解决方案是简单地重新处理整个文件,并为每一行执行INSERT ... ON DUPLICATE KEY UPDATE。您需要找到一个标识永远不会更改的用户的值并创建一个UNIQUE索引(或者使用主键,看起来它是您的情况下最有效的方法,只要id字段是那个永远不会改变),并将可能随时间变化的任何字段放入更新部分。
INSERT INTO persons SET id='1234', lastname='a', firstname = 'b' ON DUPLICATE KEY UPDATE lastname='a', firstname='b';
只要字段的长度不变(表中没有varchar或test字段),这应该允许您快速更新记录而无需截断表。截断只会增加每条记录的磁盘写入次数。
此方法还允许您创建统计信息 - 例如,您可以添加一个记录第一次看到新人的列,以便了解每个更新过程中添加了多少人。