2

私は現在、イントロスペクションを介して RDBMS からすべての情報を取得する Python ORM の作成に忙しくしています (他の点で満足している場合は XRecord を使用します)。 ORM は他のすべてを自動的に実行します (実際に何かを作成する必要があり、奇妙なものや危険な冒険を探していない場合、それはバグです)。

データベースに関連するすべての制約があり、命名規則がまったくない場合、その主な部分は関係を検出することです。このORMを、狂ったDBAが作成したデータベースで動作させたいと思っています。列とテーブルにどのような名前を付ける必要があるかについての見解。そして、私は多対多の関係で立ち往生しています。

まず、複合キーが存在する可能性があります。次に、 3 つ以上のテーブルとの MTM 関係が存在する可能性があります。次に、MTM 中間テーブルは、キーとは別の独自のデータ(それが結合するすべてのテーブルに共通のデータ) を持つ場合があります。

私が欲しいのは、テーブル X がテーブル A と B を結びつける中間テーブルであり、テーブル X にある非キー データが A と B の両方に属している必要があることをプログラムで検出する方法です (そして、A 内から共通の属性を変更した場合) 、Bの同じ属性に影響するはずです)。それを行うための一般的なアルゴリズムはありますか? または、少なくとも 80% のケースで正しいと推測するには (DBA が正気であれば) ?

4

3 に答える 3

1

あなたが尋ねなければならないなら、あなたはこれをするべきではありません。残酷だと言っているわけではありませんが、Pythonには、十分にテストされ、広く使用されている優れたORMがすでにいくつかあります。たとえば、SQLAlchemyは、autoload=Trueテーブルを定義するときに属性をサポートします。これにより、テーブル定義(質問しているすべてのものを含む)をデータベースから直接読み取ることができます。他の誰かがすでに99.9%の作業を行っているのに、なぜ車輪の再発明をするのですか?

私の答えは、Python ORM(SQLAlchemyなど)を選択し、最初から始めるのではなく、それに「欠落している」機能を追加することです。良いアイデアであることが判明した場合は、変更をメインプロジェクトにリリースして、他のすべての人がそれらの恩恵を受けることができるようにします。期待どおりに機能しない場合は、少なくとも、他の多くのプログラマーが支援できる一般的なORMをすでに使用していることになります。

于 2010-10-10T20:25:00.603 に答える
0

理論的には、複数の外部キーを持つテーブルは本質的に多対多の関係にあるため、質問は簡単です。必要なのは、オブジェクトモデルで(標準クラスではなく)MTMパターンをいつ使用するかについてのヒューリスティックだと思います。その場合、選択したパターンの制限は何かを調べてください。

たとえば、両方のタイプのオブジェクトの属性としてリストを設定することにより、単純なMTM関係(2つのテーブル、属性なし)をモデル化できます。ただし、関係自体に関する追加データがある場合は、リストだけでは不十分です。したがって、このパターンは、両方とも外部キーを持つ2つの列を持つテーブルに対してのみ呼び出します。

于 2010-10-10T20:22:08.880 に答える
0

これまでのところ、関連する 2 つ以上のテーブルをカバーする手法は 1 つしかありません。テーブル X がテーブル Y に関連していると見なされるのは、X がテーブル 1 つ以内で Y を参照している場合のみです。あれは:

「テーブルがゼロ」とは、X に Y への外部キーが含まれていることを意味します。

「1テーブル離れた」とは、テーブルXを参照する外部キー(これらは簡単に見つけることができます)とテーブルYを参照する外部キーを持つテーブルZがあることを意味します。

これにより、多くを探す特性の範囲が縮小され (中間テーブルに他の属性があるかどうかを気にする必要はありません)、MTM リレーションで結び付けられた任意の数のテーブルがカバーされます。

興味深いリンクや他の方法があれば、喜んで聞きます。

于 2010-10-10T22:07:24.187 に答える