2016-09-24 39 views
1

我设计的数据库,为我自己的Q &一个网站,这有点类似堆栈溢出:定义一个SQLAlchemy的模式可能与其他多种车型之一

  1. A“问题”可以有几个“答案”,但一个“答案”只有一个“问题”。
  2. “问题”和“答案”都可以有几个“评论”,但“评论”只有一个“问题”或“答案”。

我不知道如何设计这样的数据库。以下是我已经试过:

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('')) ??? 
+2

对于一个简单的实现,你可能会考虑让'QuestionComment'和'AnswerComment'作为独立的实体,而不是将它们放入一个单一的实体。 –

+0

@GordonLinoff谢谢你的回复。事实上,我曾考虑过这一点。或者,我可以将'Question'和'Answer'合并到'Post',它有一个名为'is_question'的布尔字段。不过,我想找一个更“优雅”的方法。 –

+0

设计看起来相当不错... – Bharel

回答

3

所以,你已经管理的第一点。

你在找什么是一种普通的关系。你可以在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作为对象的主键。

3

我建议你为问题和答案提取一个基类,例如发布,并使评论与帖子相关,使得帖子可以具有多个评论。

SQLAlchemy ORM支持一些策略到implement inheritance in the database,正确的策略选择取决于您计划查询实体的方式。这是detailed documentation on how to properly configure it

所以,你会得到这样的:

(免责声明:我没有直接运行这个代码,但是从你的例子,我自己的代码组成的,如果它不为你工作,让我知道,我会解决)

class Post(db.Model): 
    __tablename__ = 'posts' 

    id = db.Column(db.Integer, primary_key=True) 
    kind = Column(db.Unicode(64), nullable=False) 
    body = db.Column(db.UnicodeText) 
    author_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    comments = db.relationship('Comment', backref='post', lazy='dynamic') 

    __mapper_args__ = { 
     'polymorphic_identity': 'posts', 
     'polymorphic_on': kind 
    } 

class Question(Post): 
    __tablename__ = 'questions' 

    title = db.Column(db.Unicode(64), unique=True) 
    answers = db.relationship('Answer', backref='question', lazy='dynamic') 

    __mapper_args__ = { 
     'polymorphic_identity': 'questions', 
    } 

class Answer(Post): 
    __tablename__ = 'answers' 

    question_id = db.Column(db.Integer, db.ForeignKey('questions.id')) 

    __mapper_args__ = { 
     'polymorphic_identity': 'answers', 
    } 

class Comment(db.Model): 
    __tablename__ = 'comments' 

    id = db.Column(db.Integer, primary_key=True) 
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) 
相关问题