Переход с NoSQL на SQL в django
Я переношу свое приложение Mongo-Express на Postgres-Django. Приложение включает простую форму для сбора информации об ученике и книгах, которые он прочитал за лето.
API express записывает полезную нагрузку в MongoDB. Полезная нагрузка выглядит следующим образом:
{
student_id: 123,
student_name: 'James Hook',
books: [
{ book: 'War and Peace', author: 'Leo Tolstoy' },
{ book: 'Harry Potter', author: 'JK Rowling' }
]
}
Mongo - это база данных на основе документов, поэтому я могу хранить вышеуказанную полезную нагрузку как есть.
Теперь, переходя к django-postgres, мне нужно определить модели, и я вижу два варианта:
A. Просто создайте одну модель с тремя полями - student_id (IntegerField), student_name (CharField), и books (ArrayField(JSONField))
B. Зайдите в RDBMS и создайте две модели - студент и книга. Студент и книга имеют отношения "многие-ко-многим".
Дайте это, у меня есть несколько вопросов:
Q1. Если мне не нужно индексировать книги, имеет ли больший смысл вариант A?
Q2. В варианте A должно быть просто JSONField или ArrayField(JSONField)?
Q3. В варианте B, как мы записываем одновременно ДВЕ или более книг для одного ученика? Нужен ли там ArrayFiled? Как будет выглядеть модель и нарушает ли она ограничение атомарности базы данных?
Если вы собираетесь использовать RDS, используйте его в своих интересах.
Мы можем сказать, что один студент может прочитать много книг, а книга может быть прочитана многими студентами, поэтому мы будем использовать ManyToManyField
. Ваши модели могут выглядеть примерно так:
models.py
class Student(models.Model):
first_name = models.Charfield(...)
last_name = models.Charfield(...)
class Books(models.Model):
title = models.CharField(...)
students = models.ManyToManyField('Student', ..., related_name='books')
Теперь, используя Django, вы можете делать такие вещи, как:
# get a particular student based on id:
student = Student.ojects.get(id=<the-id>)
# get the queryset of books they read:
read_books = student.books.all()
# get all of the students that read "Dracula":
dracula = Books.objects.get(title='Dracula')
students_that_read_dracula = dracula.students.all()