Хранение субтитров в базе данных

Я работаю над проектом, который использует AI для распознавания речи аудиофайла. Выходом этого ИИ является огромный объект JSON с тоннами значений. Я удалю некоторые ключи, и конечная структура будет выглядеть следующим образом.

{
    text: "<recognised text>",
    language: "<detected language>"
    segments: [
        {startTimestamp: "00:00:00", endTimestamp: "00:00:10", text: "<some text>"},
        {startTimestamp: "00:00:10", endTimestamp: "00:00:17", text: "<some text>"},
        {startTimestamp: "00:00:17", endTimestamp: "00:00:26", text: "<some text>"},
        { ... },
        { ... }
    ]
}

Теперь я хочу сохранить этот новый обрезанный объект в базе данных SQL, потому что я хочу иметь возможность редактировать его вручную. Я создам React-приложение для редактирования сегментов, удаления сегментов и т.д. Кроме того, я хочу добавить эту функцию в React-приложение, где информация будет сохраняться каждые 5 секунд с помощью AJAX-вызова.

Теперь я не понимаю, как я должен хранить этот объект в базе данных SQL. Изначально я думал, что буду хранить весь объект как строку в базе данных. Всякий раз, когда в объект вносятся какие-то изменения, я буду отправлять JSON-объект из приложения React, бэкенд будет его санитировать, а затем заменять старый строковый объект в базе данных новым строковым объектом. Таким образом, обновление и удаление будет происходить легко, но могут возникнуть проблемы в случае поиска. Но мне интересно, есть ли какие-нибудь лучшие подходы для этого.

Может кто-нибудь подсказать мне?

Технологический стек

  • Frontend - React
  • Backend - Django 3.2.15
  • База данных - PostgreSQL

Спасибо

Теперь я не понимаю, как я должен хранить этот объект в базе данных SQL. Первоначально я думал, что буду хранить весь объект в виде строки в базе данных.

Если данные имеют четкую структуру, вам следует не хранить их в виде JSON-блоба в реляционной базе данных. Хотя в настоящее время реляционные базы данных имеют некоторую поддержку для JSON, она все еще не очень эффективна, и обычно это означает, что вы не можете эффективно фильтровать, агрегировать и манипулировать данными, а также проверять ссылочную целостность.

Вы можете работать с двумя моделями, которые выглядят следующим образом:

from django.db import models
from django.db.models import F, Q


class Subtitle(models.Model):
    text = models.CharField(max_length=128)
    language = models.CharField(max_length=128)


class Segment(models.Model):
    startTimestamp = models.DurationField()
    endTimestamp = models.DurationField()
    subtitle = models.ForeignKey(
        Subtitle, on_delete=models.CASCADE, related_name='segments'
    )
    text = models.CharField(max_length=512)

    class Meta:
        ordering = ('subtitle', 'startTimestamp', 'endTimestamp')
        constraints = [
            models.CheckConstraint(
                check=Q(startTimestamp__gt=F('endTimestamp')),
                name='start_before_end',
            )
        ]

Это также гарантирует, что startTimestamp находится перед endTimestamp, например, что эти поля хранят длительность (а не "foo", например).

Вы можете конвертировать из JSON и в JSON с помощью сериализаторов [drf-doc]:

from rest_framework import serializers


class SegmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Segment
        fields = ['startTimestamp', 'endTimestamp', 'text']


class SubtitleSerializer(serializers.ModelSerializer):
    segments = SegmentSerializer(many=True)

    class Meta:
        model = Subtitle
        fields = ['text', 'language', 'segments']
Вернуться на верх