Переход с 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()
Вернуться на верх