Flask Database Model Design I am developing my first website in Flask using PostgreSQL and I want my database to have professors from all universities and courses in the USA.

As I am not very familiar with databases I have experienced some issues with my database model design.

Basically, I want to have a Professor, College and  Course models. 

1) A professor has:


An id (primary key)
A name
A college (foreign key)
A course (foreign key)


2) A college has:


An id (primary key)
A name (e.g. Harvard University)
Many professors


3) A course in my model is not a college-specific course (e.g. Harvard CS) but a subject which can be identical throughout many colleges, e.g. Biology. It therefore has:


An id (primary key)
A name (e.g. Biology)
Many professors


My end goal is just to have a list of all professors and people can search through them by filtering according to a subject, college, or both.

As you can see I haven't implemented a relationship between colleges and courses.

This is my code:

class Professor(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(80), unique=False)
  college_id = db.Column(db.Integer, db.ForeignKey('college.id'))
  course_id = db.Column(db.Integer, db.ForeignKey('course.id'))

class College(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(120), unique=True)
  professors = db.relationship('Professor', backref='college', lazy='dynamic')

class Course(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(120), unique=True)
  professors = db.relationship('Professor', backref='course', lazy='dynamic')


I was wondering if this is a good database design. Am I going to be able to do what I'm aiming for with the DB models staying the same?
I think at least the relationship between Professor and Course is many to many.

courses_professors = db.Table(
    db.Column(db.Integer(), db.ForeignKey("course.id"),
    db.Column(db.Integer(), db.ForeignKey("professor.id"))

class Course(db.Model):
    id = db.Column(db.Integer(), primary_key=1)
    name = db.Column(db.String(128), unique=1)

class Professor(db.Model):
    id = db.Column(db.Integer(), primary_key=1)
    name = db.Column(db.String(64))
    courses = db.relationship("Course", secondary=courses_professor, backref=db.backref("professors")


If the relationship between Professor and College is also many to many, you can also define a association table between them as preceding codes.