私はSQLで錆びており、SQL Alchemyに全く新しいですが、両方を使用する予定のプロジェクトがあります。だから私は快適になるようなものを書くと思った。二日酔いに苦しんで、私はアルコールレベルを追跡するために何かを書くことに決めました。SQLAlchemy(ORM)の3つのテーブルに対して多対多関係をモデル化するにはどうすればよいですか?
私はusers
がdrinks
に参加し、消費events
を持っています。それらは私の3つの基本的なテーブルです(guestlist
、のユーザとイベントの間のm:nの関係)。
ドリンクリストのすべてのイベントすべてユーザーにすべての時間(何をマッピングする必要はありません)でご利用いただけドリンク。 ユーザーは時々作成されるので、イベントです。すべてのユーザーはすべてイベントに参加することができます。そのため、guestlist
テーブルを使用してそれらのマップを行います。
ここで質問の中心に:どのユーザーがいつどのドリンクを飲むのかを把握する必要があります。私はこれを別のテーブルshots
(下記参照)で解決しようとしますが、これは良い解決策であるかどうかはわかりません。 SQL Alchemyで
ERP Diagram http://s1.anyimg.com/img/g6ld1ku/Bildschirmfoto.png
それは多少このようになり(またはしないが、これは私がこれまでに思い付いたものです)かもしれません::
guestlist_table = Table('guestlist', Base.metadata,
Column('event_id', Integer, ForeignKey('events.id')),
Column('user_id', Integer, ForeignKey('users.id'))
)
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
started = Column(DateTime, nullable=False, index=True,
default=datetime.datetime.now
)
users = relationship("User", secondary=guestlist_table, backref="events")
# ...
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False, unique=True, index=True)
birthdate = Column(Date, nullable=False)
weight = Column(Integer, nullable=False)
sex = Column(Boolean, nullable=False)
# ...
class Drink(Base):
__tablename__ = 'drinks'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
volume = Column(Numeric(5,2), nullable=False)
percent = Column(Numeric(5,2), nullable=False)
# ...
class Shots(Base):
__tablename__ = 'shots'
id = Column(Integer, primary_key=True)
at = Column(DateTime, nullable=False,
default=datetime.datetime.now
)
user_id = Column(Integer, ForeignKey('users.id'), index=True)
event_id = Column(Integer, ForeignKey('events.id'), index=True)
drink_id = Column(Integer, ForeignKey('drinks.id'))
user = relationship("User", backref="shots")
event = relationship("Event", backref="shots")
drink = relationship("Drink", uselist=False) # one-to-one, no backref needed
私が構築するための良い方法を見つけるのに苦労はどのように私はrelationshipsを策定すべきであり、どのように私行いますユーザーとドリンク一緒、イベントをマッピングするテーブルそれは?
私は何かを見落としていると感じます。 そして、率直に言って私は質問に絶対に失われていますか?
私は、少なくともイベントで消費全てのショットを取得する必要があり- (おそらくユーザーによってソートされた)私も時々、すべてのショットが必要
- :
ここで私はほとんどの時間になるだろうクエリがありますイベントごとのショット
- Uあたりのショット数の
- 番号:(おそらくイベントによってソートされた)特定のユーザ
- ・計数の多くのためにユーザーがイベント
で撃墜されたショットのSER
shots
テーブルですか?
こんにちは@Brutus、あなたの関係は1人のユーザーが多くのイベントに参加でき、1人のイベントに多くのユーザー(guestlist)がいるようです。 1つのイベントは多くの飲み物を、そして1つの飲み物は多くのイベント(飲み物リスト)に役立ちます。 1人のユーザーは多くの飲み物を飲むことができ、1人の飲み物は多くのユーザーに提供することができます(ゲストドリンクリスト)。これは正しいです? – Nilesh
すべての飲み物はすべてのイベントで利用できるので、私は 'drinklist'が必要ないかもしれないと思った。あなたが 'guestdrinklist'と呼んでいたものを' Shots'クラスでモデル化しようとしました。クラスを2つのテーブルに分割する方が良いでしょうか? – Brutus
すべての飲み物がすべてのイベントで利用可能な場合は、飲み物とイベントの関係を指定する必要はありません。フィールドのサブセットが他のエンティティと関連付けられている場合は、関係が指定されている必要があります。飲み物とユーザーの関係を作り出すことができます。 – Nilesh