4

DB 設計に関する私の質問への回答は、単一テーブルの継承と呼ばれるものを提案しました。それについて少し調べてみましたが、それほど明確な情報を見つけることができないようです。

基本的に私が理解しているように見えるのは、すべてのフィールドとタイプ フィールドを含む大きなテーブルがあり、ORM レイヤーがタイプ フィールドを使用してさまざまなオブジェクト ビューを提供するということです。あれは正しいですか?

さらに重要なことに、単一テーブルの継承は「承認された」データベース設計手法ですか? つまり、それを使用するのは「賢明」ですか?それを使用しても安全ですか、それとも問題を引き起こしますか?

もう1つの問題は、これがレールでどれだけうまく機能するかということです? Railsからいくつかの参照を見つけましたが、従来とは異なる方法で問題を引き起こすのでしょうか?

どんな助けでも大歓迎です。

4

7 に答える 7

5

それは良い考えですか?場合によります。テーブルが単一の目的を持たないという点で、正規化を破ります。基底クラスを n 回拡張するとどうなりますか? テーブルに列を追加する必要があります。テーブルを変更できるため、最近のほとんどのDBでは問題はありませんが、クラスのリファクタリングと削除についてはどうでしょうか。これで、目的のない列ができました。

経験則 - ほとんどの設計が完成していれば、おそらく安全に使用できます。設計が頻繁に変更される場合 - 他の問題があり、ユース ケース/ユーザー要件をロックダウンする必要があります。(はい、実際には XP フレンドリーではありません)

Railsの効果については知りません。

于 2008-10-14T11:39:23.890 に答える
1

つまり、Single Table Inheritance (STI) は、データベースへの OOP 継承関係のマッピングを可能にする設計パターンです。ActiveRecord モデル オブジェクトからサブクラスを定義する場合は、STI を検討する必要があります。

STI は (もともと?) Martin Fowler の「Patterns of Enterprise Application Architecture」の本に記載されており、DHH の正規の Rails の本「Agile Web Development with Rails」(セクション 18.4 だと思います) にも記載されています。このスペースで私が期待できるよりもはるかに優れた説明を提供してくれます。

www.matthewpaulmoore.com (このスレッドで robintw によってリンクされています) で表明されている、性感染症は本質的に悪いものであるという意見には、私は強く同意しません。これは、OOP 継承の使用を軽視するやや単純な見方のようです。私は STI を使用して Rails でいくつかのエレガントなソリューションを作成しましたが、どのデザイン パターンも悪用できると思います。

于 2008-10-14T23:44:53.083 に答える
1

STI は、オブジェクト指向の考え方とデータベース指向の考え方のミスマッチに対処する方法です。これにより、データベース内の情報の適切な表現と、オブジェクト モデル内の別の表現が可能になります。

たとえば、各製品に 1 つ以上の手数料が含まれているアプリケーションがあり、それぞれがわずかに異なる方法で計算されているとします。私のオブジェクト モデル内で、Fee クラスのサブクラスを作成したいと考えています。各サブクラスは、それ自体を計算する方法を知っています。ただし、料金タイプごとにテーブルを作成する必要はありません。基本クラスとして料金を作成し、テーブルとして料金を作成します。これには、すべてのサブタイプで必要なすべてのフィールドの結合と「タイプ」が含まれます。関連するサブクラスの名前に対応する値を持つ列。その後の配管は ActiveRecord が処理します。

于 2008-10-14T11:40:10.923 に答える
0

http://www.matthewpaulmoore.com/articles/1276-ruby-on-rails-code-quality-checklist#stiを見たばかりですが、これは悪い考えを示唆しています。

于 2008-10-14T12:15:56.187 に答える
0

一般的には便利だと思いますが、いくつかのバグに遭遇しました

そのリンクの例は、それをどのように使用するかについての有用な図を提供する場合があります。

于 2008-10-21T02:37:16.867 に答える
0

決定的な参照。単一のテーブルに、共通の基本クラスを持つ複数のオブジェクトを格納できます。

Ruby on Rails はActive Recordというライブラリを使用しています。これは、STI をサポートする一般的な Ruby フレームワークです。

于 2008-10-14T11:24:26.947 に答える
0

型ごとのテーブル (TPT) 機能を含む (新しい) ADO Entity Framework の観点からしか話せません。

これは、主要な概念 (Entity Framework を使用) を紹介する優れた一連のブログ投稿であり、これに関する MSDN の論文もここにあります

TPT に nHibernate を使用する場合のガイダンスもあるようです。ここにあります。

SQL Server の table-per-type 継承を説明するこのリンクがあります。これは、かなり良い要約と概念の紹介を持っているようです。

それがRailsにどのような影響を与えるかはわかりません。

于 2008-10-14T11:58:16.677 に答える