4


2

MS Accessで(Type、ID)(別名 'polymorphic') - 外部キー列を作成する方法を教えてください。

Ruby-on-Railsでは、これを「多相関連」と呼びます。

私のアプリケーションには「コメント可能」なものがいくつかあります。それぞれの表は以下のとおりです。

Post
id | title | text | author (FK:Person.id) | ...

Person
id | name | ...

Photo
id | title | owner (FK:Person.id) | path | ...

以下のように `Comments`テーブルを追加したいです。

Comments
id | commentable_type | commentable_id | text | author (FK:Person.id)

私はデータベースの参照整合性をこのようにして失うことを理解しています、しかし他の唯一の選択肢は複数の Comments`テーブルを持つことです: PostComments`、 PersonComments、` PhotoComments`、…​

そして今、質問のために:

最初に Comments.commentable_type`からテーブル名を取得し、それから Comments.commentable_id`からIDを取得することで、ルックアップ方法を説明するフォームを構築するにはどうすればいいですか?

2 Answer


4


この技術は、SQLの世界では口語的に「サブクラス化」と呼ばれています。 実用的な例(SQL Serverの構文ですが、MS Accessには簡単に適用できます)については、http://web.archive.org/web/20100309034643/http://consultingblogs.emc.com/davidportas/archive/2007/01/を参照してください。 08 / Distributed-Keys-and-Disjoint-Subtypes.aspx [David Portaのブログ]。

あなたのシナリオでは、すべてのコメントに共通のデータ項目はあなたのコメントテーブルにあるでしょう。各タイプに固有のものは、PhotoCommentsなどの特殊なテーブルにあります。 FKは、IDと型の2列の複合である必要があります。これは見落とされがちですが、ここでは参照整合性にとって不可欠です。 PersonCommentsテーブルに写真のコメントとして入力したくないものはありません。


0


私は多くの人がそのようなことのためにメタテーブルを作ると信じています。 あなたがそれを説明したのとほぼまったく同じです。