Php Symfony/Doctrine-通过外部数据源使数据库保持最新

Php Symfony/Doctrine-通过外部数据源使数据库保持最新,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我正在开发一个严重依赖外部API数据的应用程序。我需要将其存储在数据库中以执行一些搜索等。数据经常更改,必须每天“同步”。因此,我正在寻找一种有效的方法,从API中提取新数据,并使用新的、更新的和删除的实体更新数据库 然而,我只遇到关于查询每个实体的差异以确定是执行更新还是插入的建议,这对我来说效率很低。或者截断所有数据,只进行插入。但是,是否有任何现有的(更有效的)工具、技术或策略来实现这一点,或者这是一条可行的道路 提前谢谢 您可以为每个项目生成一个哈希,并在下次导入时进行比较。每行需要两样

我正在开发一个严重依赖外部API数据的应用程序。我需要将其存储在数据库中以执行一些搜索等。数据经常更改,必须每天“同步”。因此,我正在寻找一种有效的方法,从API中提取新数据,并使用新的、更新的和删除的实体更新数据库

然而,我只遇到关于查询每个实体的差异以确定是执行更新还是插入的建议,这对我来说效率很低。或者截断所有数据,只进行插入。但是,是否有任何现有的(更有效的)工具、技术或策略来实现这一点,或者这是一条可行的道路


提前谢谢

您可以为每个项目生成一个哈希,并在下次导入时进行比较。每行需要两样东西:

  • 唯一的ID
  • 可以更改的数据散列
  • 例如,如果您收到如下条目:

    {
       "id": 42,
       "title": "something",
       "description": "the description of this item"
    }
    
    您生成一个hash
    sha1($row['title'].|'.$row['description'])
    ,在下一次导入期间,您所要做的就是将旧的hash与新的hash进行比较。您必须遵守以下规则:

  • 如果数据库中不存在行的ID:INSERT
  • 如果数据库中存在该行的ID,并且数据库中的哈希值与从该行生成的哈希值不同:UPDATE
  • 如果新数据中缺少数据库中的ID:删除

  • Ps:如果外部API允许您访问每一行的上次修改时间,您可以将哈希替换为日期。

    有趣的解决方案,我将研究它!Thanks@JohanPalmfjord你的问题解决了吗?如果是,你能和我们分享吗?我已经有了同样的困境。@nicram我最后写了一个差异检查程序,基本上按照这个答案的意思做了。数据集足够小,可以保存在内存中,因此我可以在一个select中查询所有内容,然后在两个不同的列表之间进行差异检查。它不是很快,但速度不够慢,在这种情况下,它不会成为一个问题。不幸的是,我没有代码了,所以很难分享细节,对不起。