2012-04-03 6 views
7

私はSQLで錆びており、SQL Alchemyに全く新しいですが、両方を使用する予定のプロジェクトがあります。だから私は快適になるようなものを書くと思った。二日酔いに苦しんで、私はアルコールレベルを追跡するために何かを書くことに決めました。SQLAlchemy(ORM)の3つのテーブルに対して多対多関係をモデル化するにはどうすればよいですか?

私はusersdrinksに参加し、消費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テーブルですか?

  • +0

    こんにちは@Brutus、あなたの関係は1人のユーザーが多くのイベントに参加でき、1人のイベントに多くのユーザー(guestlist)がいるようです。 1つのイベントは多くの飲み物を、そして1つの飲み物は多くのイベント(飲み物リスト)に役立ちます。 1人のユーザーは多くの飲み物を飲むことができ、1人の飲み物は多くのユーザーに提供することができます(ゲストドリンクリスト)。これは正しいです? – Nilesh

    +0

    すべての飲み物はすべてのイベントで利用できるので、私は 'drinklist'が必要ないかもしれないと思った。あなたが 'guestdrinklist'と呼んでいたものを' Shots'クラスでモデル化しようとしました。クラスを2つのテーブルに分割する方が良いでしょうか? – Brutus

    +0

    すべての飲み物がすべてのイベントで利用可能な場合は、飲み物とイベントの関係を指定する必要はありません。フィールドのサブセットが他のエンティティと関連付けられている場合は、関係が指定されている必要があります。飲み物とユーザーの関係を作り出すことができます。 – Nilesh

    答えて

    5

    エンティティリレーションシップダイアグラムを作成することをお勧めします。人とあなたの質問を理解するのははるかに明確です。私は、少なくとも(おそらくユーザーによってソートされた)イベント

    はあなたができた、イベントのすべてのショットを取得するために消費するすべてのショットを取得する必要があり

    は、あなたの質問に答えるために試してみてください

    session.query(Shots).filter_by(event_id=event_id) 
    

    event_idは、照会したいイベントのIDです。ユーザーごとに保存するには、試すことができます

    from sqlalchemy.sql.expression import desc, asc 
    session.query(Shots) \ 
        .filter_by(event_id=event_id) \ 
        .order_by(asc(Shots.user_id)) 
    

    もちろん、ユーザーの属性で並べ替えることもできますが、ユーザーテーブルに参加することもできます。

    from sqlalchemy.sql.expression import desc, asc 
    session.query(Shots) \ 
        .filter_by(event_id=event_id) \ 
        .join(User) \ 
        .order_by(asc(User.name)) 
    

    私も時々(恐らくイベントによってソートされた)特定のユーザ

    ただ、先の例のようにのためにすべてのショットが必要

    イベント

    session.query(Shots) \ 
        .filter_by(event_id=event_id) \ 
        .count() 
    
    あたりのショット数

    私はそれらを実行していない、私はここにそれらを書いたが、彼らは私がタイプミスをしなかった場合は、すべて動作するはずです。

    +0

    お返事ありがとうございます。私が家に帰るとすぐに試してみる。私もERPを追加しました。そして、私のテーブルレイアウトについて:私の質問があれば、 'shots'テーブルはデータを一緒にマップする有効な方法だと思いますか?あるいは、テーブルとリレーションシップを整理する別のアプローチを使用する必要がありますか? – Brutus

    関連する問題