Назначение идентифицируемых уникальных идентификаторов строкам при импорте данных из XML - PullRequest
0 голосов
/ 12 апреля 2019

Я проектирую базу данных, в которую я буду ежедневно импортировать большой объем данных из XML для создания или обновления существующих строк. Данные элемента охватывают десятки таблиц, связанных с item_id в основной item таблице

Для каждого элемента в файле XML мне нужно проверить, существует ли он уже в базе данных, и обновить или создать, если его там нет.

Каждый XML принадлежит к source_id, и каждый элемент в XML содержит уникальный буквенно-цифровой идентификатор до 50 символов (но эти идентификаторы не уникальны для всех XML), поэтому source_id:xml_item_id будет уникальным здесь

Мне нужен способ узнать, существует ли элемент в базе данных. В идеале я буду искать по pk и использовать тот же pk для объединения других таблиц

  • Попытка 1

    Я пытался кодировать source_id:xml_item_id в bigint для pk, а также декодировать bigint обратно к исходному source_id:xml_item_id, но в большинстве случаев это переполняется

    • Так что это не сработает
  • Попытка 2

    Используйте UUID для pk и source_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
  • Старайтесь не сильно влиять на производительность JOIN

1 Ответ

0 голосов
/ 12 апреля 2019

Вы можете использовать уникальные вместе

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...