Хранение субтитров в базе данных
Я работаю над проектом, который использует 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']