Структура базы данных для голосования по статьям и комментариям

#python #sqlalchemy #schema #relational-database

#python #sqlalchemy #схема #реляционная база данных

Вопрос:

Я довольно новичок в реляционных базах данных и веб-программировании в целом, и я столкнулся с проблемой структурирования моей базы данных для использования системы голосования, подобной reddit.

Я использую sqlalchemy, важные моменты показаны ниже:

 
class Vote(Base):
    __tablename__ = 'votes'

    id        = Column(Integer, primary_key = True)
    vote_type = Column(Integer, default = 0)
    user_id   = Column(Integer, ForeignKey('users.id'))

    #article_id = Column(Integer, ForeignKey('article_items.id'))
    #comment_id = Column(Integer, ForeignKey('comments.id'))

class ArticleItem(Base):
    __tablename__ = 'article_items'

    id         = Column(Integer, primary_key = True)
    vote_ups   = Column(Integer, default = 0)
    vote_downs = Column(Integer, default = 0)
    article    = relationship("Article",
                              uselist = False,
                              backref = 'article_item')
    comments   = relationship("Comment")
    votes      = relationship("Vote", cascade = "all")

class Comment(Base):
    __tablename__ = 'comments'

    id      = Column(Integer, primary_key = True)
    data    = Column(Text, nullable = False)
    replies = relationship("Comment")

    vote_ups   = Column(Integer, default = 0)
    vote_downs = Column(Integer, default = 0)
    votes      = relationship("Vote", cascade = "all")

    parent_id  = Column(Integer, ForeignKey('comments.id'))
    article_id = Column(Integer, ForeignKey('article_items.id'))
  

В нынешнем виде я должен включить два внешних ключа в class Vote , но только один из двух ключей используется в любое время.

Есть ли какой-нибудь более простой / рекомендуемый способ сделать это? Должен ли я вместо этого сохранить два разных типа голосования; один для комментариев, а другой для статей? Или, может быть, мне следует объединить ArticleItem и Comment в один class Voteable ?

Комментарии:

1. Взгляните на пример общих ассоциаций .

2. К сожалению, это немного выше моего понимания, я постараюсь прочитать это более внимательно. Но, насколько я понимаю, вместо этого он сохраняет type столбец, а отношение обрабатывается полиморфно; в случае только двух возможных родителей, разве это не то же самое, что указано выше?

3. Это не совсем то же самое. и в некотором смысле ваш код мне нравится больше по сравнению с generic_fk recipe, потому что вы можете применять ForeignKey ограничения. Я не думаю, что есть более простой способ сделать то, что вы сделали. Хотя, возможно, есть более чистый способ.