从XML导入数据时,为行分配可识别的唯一ID

问题描述 投票:0回答:1

我正在设计一个数据库,我将每天从XML导入大量数据以创建或更新现有行。项目数据涵盖了几十个表,这些表都与item_id主表中的item相关

对于XML文件中的每个项目,我需要检查它是否已存在于数据库中并更新或创建(如果它不存在)。

每个XML都属于source_id,XML中的每个项目都包含一个最多50个字符的唯一字母数字ID(但这些ID在所有XML中并不是唯一的),所以source_id:xml_item_id在这里是唯一的

我需要的是一种查找项目是否已存在于数据库中的方法。理想情况下,我将通过pk搜索并使用相同的pk来加入其他表

  • 尝试1 我已经尝试将source_id:xml_item_id编码为bigint用于pk以及将bigint解码回原来的source_id:xml_item_id,但大多数时候这是溢出的 所以这不会起作用
  • 尝试2 使用UUID作为pksource_id:xml_item_id作为unique_id (string)供搜索,但将相关表格加入UUID 虽然我没有看到任何错误(IMO),JOINs可能会受到影响,我更喜欢数字pk用于URLs
  • 尝试3 使用source_id:xml_item_id作为pk (string) 与尝试2相同的担忧

我在所有尝试中避免使用AI PKs的原因是,将来很有可能对这些数据进行分片,并且我希望这对PKs在生成这种情况时的生成方式的影响相对较小。

处理这个问题的最佳方法是什么?

  • 识别数据库中是否已存在项目
  • 拥有用户友好的URL URL
  • 尽量不要过多地影响JOIN性能
python django postgresql
1个回答
0
投票

您可以一起使用

class Data(models.Model):
    source_id = models.CharField()
    xml_item_id = models.CharField()
    # ... other fields

    class Meta:
        unique_together = ("source_id", "xml_item_id")

然后在你的导入功能中:

scid = your_xml_source_id
xmlid = your_xml_id
obj, created = Data.objects.get_or_create(source_id=scid, xml_item_id=xmlid)
if created:
    # it's the new object, populate obj with the rest of the data
    obj.other_field = your_xml_other_field
else:
    # it's existing object, update object with a new value
    obj.other_field = new_value
obj.save()
© www.soinside.com 2019 - 2024. All rights reserved.