#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
ограничения. Я не думаю, что есть более простой способ сделать то, что вы сделали. Хотя, возможно, есть более чистый способ.