我正在为自己的问答网站设计数据库,有点类似于Stack Overflow:
- 一个“问题”可以有多个“答案”,但一个“答案”只有一个“问题”。
- “问题”和“答案”都可以有多个“评论”,但一个“评论”只有一个“问题”或“答案”。
我不知道如何设计这样的数据库。这是我尝试过的:
class Question(db.Model):
__tablename__ = 'questions'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.Unicode(64), unique=True)
body = db.Column(db.UnicodeText)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
answers = db.relationship('Answer', backref='question', lazy='dynamic')
class Answer(db.Model):
__tablename__ = 'answers'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.UnicodeText)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
question_id = db.Column(db.Integer, db.ForeignKey('questions.id'))
class Comment(db.Model):
__tablename__ = 'comments'
id = db.Column(db.Integer, primary_key=True)
# post_id = db.Column(db.Integer, db.ForeignKey('')) ???
请您参考如下方法:
所以你已经做到了第一点。
您正在寻找的是一般关系。您可以在 sqlalchemy_utils 中找到它包。
from sqlalchemy_utils import generic_relationship
class Comment(db.Model):
__tablename__ = 'comments'
id = db.Column(db.Integer, primary_key=True)
object_type = db.Column(db.Unicode(255))
object_id = db.Column(db.Integer)
object = generic_relationship(object_type, object_id)
Docs对于一般关系
基本上它的作用是,它将 object_type 存储为答案或问题,将 object_id 存储为对象的主键。
