1

タイトルが正しいかどうかわからないので、例を挙げましょう

TableAクラスとTableBクラスがあるとしHistoryます。

Historyちょうどであるid, attribute, old value, new value

各テーブルには、 と多対多の関係がありHistoryます。

明らかに、関係を追跡するためにtablea_historyandテーブルを作成できます。tableb_history

ただし、5 ~ 10TableA/B個のタイプ テーブルと 3 ~ 4 個Historyのタイプ テーブルを用意する予定なので、合計するとかなりの数の単純な関係テーブルになります。それは大丈夫ですか?(管理と効率の両方で?) 多くの余分なコードが追加されるようです。

Historyによって定義することもできますが、id, table_name, attribute, old, newSQLAlchemy の適切な関係を作成する方法がわかりません。

TL;DR

子テーブルを複数の種類 (異なるクラス) の親テーブルに関連付ける最良の方法は何かを尋ねていると思います。これにより、舞台裏のことを心配せずに、優れた SQLalchemy 関係を使用することができます。

4

1 に答える 1

0

だからここに私が決めたものがあります。それが最も効率的かどうかはわかりませんが、Eventそうあるべきだと思われます...HistoryDeviceTableA/B

このような Mixin を使用して、すべてのテーブルにリレーションシップを簡単に追加できます次に、 Relationship ()の primaryjoin プロパティを変更して、テーブルでフィルタリングできます。コード例:

class Event(Base):

    #tablename
    type = Column(Unicode(50), nullable=False, index=True)
    #foreign id
    table_id = Column(Integer, nullable=False, index=True)
    attr = Column(Unicode(50), nullable=False)
    old = Column(Unicode(50), nullable=False)
    new = Column(Unicode(50), nullable=False)

class MetadataMixin(object):
    @declared_attr
    def events(cls):
        joinstr = '{0}.id == foreign(Event.table_id) and Event.type == "{1}"'.format(cls.__name__, cls.__tablename__)
        return relationship('Event', primaryjoin=joinstr, backref=cls.__name__.lower())

そして今、それを使うことができます:

class Device(MetadataMixin, Base):
    pass

>>> d = Device()
>>> d.events
[]

この回答を受け入れる前に、誰かがより良い回答を思いつくかどうかを確認するために、この質問を開いたままにしておきます。

于 2013-08-19T05:18:35.350 に答える