1

これが私の ORM エンティティ クラスです。主キーは複合原因 'id_string' は異なるユーザー (uid によって識別される) で同じである可能性があります。このクラスに基づいてテーブルを作成するときの Postgres SQL エラーからわかったことの 1 つ (

ProgrammingError: (ProgrammingError) there is no unique constraint matching given keys for referenced table "sync_entities"

) は、parent_id_string の ForeignKey() 引数に何かを追加する必要があるということです。そして、それは現在のレコードの uid だと思います。

別の主キー (自動インクリメント整数) を使用することをお勧めしますか、それとも他の方法がありますか?

class SyncEntity(Base):
    __tablename__ = 'sync_entities'
    __table_args__ = (ForeignKeyConstraint(['uid'], ['users.uid'], ondelete='CASCADE'), {})

    uid = Column(BigInteger, primary_key=True)

    id_string = Column(String, primary_key=True)
    parent_id_string = Column(String, ForeignKey('sync_entities.id_string'))
    children = relation('SyncEntity',
                        primaryjoin=('sync_entities.c.id_string==sync_entities.c.parent_id_string'),
                        backref=backref('parent', \
                                        remote_side=[id_string]))

    # old_parent_id = ...
    version = Column(BigInteger)
    mtime = Column(BigInteger)
    ctime = Column(BigInteger)
    name = Column(String)
    non_unique_name = Column(String)
    sync_timestamp = Column(BigInteger)
    server_defined_unique_tag = Column(String)
    position_in_parent = Column(BigInteger)

    insert_after_item_id = Column(String, ForeignKey('sync_entities.id_string'))
    insert_after = relation('SyncEntity',
                            primaryjoin=('sync_entities.c.id_string==sync_entities.c.insert_after_item_id'),
                            remote_side=[id_string])

    deleted = Column(Boolean)
    originator_cache_guid = Column(String)
    originator_client_item_id = Column(String)
    specifics = Column(LargeBinary)
    folder = Column(Boolean)
    client_defined_unique_tag = Column(String)
    ordinal_in_parent = Column(LargeBinary)
4

2 に答える 2

1

ご存じのように、主キーは自動インクリメントされた整数であることが通常は最善の方法です。システム内で一意に見える値は、将来的に重複する可能性があります。彼らの独自性に頼っていたら、あなたは深刻な問題に直面しています。

ただし、各行の値の特定のペア (またはトリプル) を一意にする必要がある場合は、テーブルに制約を追加するだけで、自動インクリメント整数を主キーとして使用します。その後、要件が変更された場合は、他の場所に変更を加えることなく、一意の制約を変更/削除/緩和できます。

また、単純な整数キーを使用している場合、結合はより単純になり、DBMS でより高速に実行できます。

于 2012-08-30T10:37:57.207 に答える
0

いいアイデアを思いついたと思います。(parent_id_string, uid) や (insert_after_item_id, uid) などの__ tableargs __メンバーに複雑な外部キー構成を作成し、それに応じて primaryjoin ステートメントを変更する必要があるだけです。

于 2012-08-30T10:34:37.957 に答える