2012-04-08 7 views
10

レールのSTI(単一テーブル継承)は、混乱したデータモデルと準最適なデータベースにつながるので、私たちは皆知っています。ActiveRecordのPostgreSQL継承?

しかし、PostgreSQLは継承をきれいに処理するようです!

痛いほどワイドなテーブルと "タイプ"の列ではなく、Postgresの継承を利用しながら、レールのきれいなSTI APIを取得する方法はありますか?

+1

「だから、我々はすべてそれが雑然とデータモデルと次善のデータベースにつながるため、RailsのSTI(単一テーブル継承)が不快であることを知っています。」 ---私はこの前提を受け入れません。 –

+0

オーケー、多分それは一般化のビットがあります..しかし、それはあなたがの完全な大規模なワイド・テーブルで終わるそうでなければ...あなたの子供のモデルが他の子供たちには適用されないプロパティの多くを持っていないときだけ良いアイデアをする傾向がありますヌル可能な列。レールの観点からは大丈夫かもしれませんが、データベース上で未処理のSQLを実行するとちょっと醜いことがあります。おそらくPostgreSQLの継承はそれほど速くはありませんが、少なくともそれはすべて私から離れています! :P –

+0

Postgresの継承はシームレスに収まるので、 'type'カラムで十分であるとは思いませんか?私は 'すべての関連する列を返します(と私はあまりにもすべて関連付けられていない列を推測SELECT *'、相続で見てきたものから :/ ...しかし、あなたのDB構造がきれいになり – stuartc

答えて

3

短くても、今のところあなたが達成しようとしているものに対してはきれいなSTI APIはありません。

私は実際には約一年前にそのAに見て、それはいくつかの理由のために良いアイデアではないという結論に達した:

  1. あなたは、PostgreSQL固有の機能を利用したい場合 - あなたは基本的に自分と結婚していますそのDBに。間違ってはいけないPostgreSQLは偉大なDBであり、私は数多くの機会にそれを使ってきましたが、あなたはそのDBとアプリケーションのデザインにこだわっています。
  2. ほとんどの場合、DB固有の機能を使用し始めると、それらを手動で実装するか(DB上で何らかのコマンドを実行するかGUIを使用する)、実行しているときに呼び出さなければならない何らかのスクリプトを書くことになりますdb:migrate(適切なテストを行いたい場合は、これを行う必要があります)。しばらくすると、面倒で迷惑になります。
  3. あなたはあなたの「痛いほど広いテーブルと 『タイプ』欄を」引用し、より多くのとで、よりイライラしていることが判明した場合その後:
    • あなたのテーブルデザインを再考する必要があり、
    • あなたのモデルをやり直しますSTIの良い候補にはならないかもしれません。
    • あなたはそれだけで生きていなければなりません。

ほとんどのITの問題は、本当にこれに降りてくる:給付対努力を。あなたのケースでは

あなた自身にこの質問をする必要があります。

  • どのくらいの時間あなたはそれだけで、あなたの生のSQLクエリをスピードアップする場合は、数秒で優れたSTI 構造の実装に費やすしたいですか?より詳細なSQLクエリを記述する方がよいでしょうか?ほとんどのアプリケーションは、実際に問題になるサイズには成長しません。しかし、あなたの場合には違うかもしれません。

PS:また

あなたのアプリでSTIを構造上のクイックヒント:あなたはすべてを継承しProductCategory、CommentCategory、PhoneCategory、ClientCategoryのようにSTIを使用する機種の多くを持っていることが判明した場合Cateogoryから - 私はモデルディレクトリ内のフォルダにそれらを整理する傾向があります。 PostgreSQLは非常に美しく、継承を扱うように見えるしかしconfig.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]

+1

過程で今まであなたを持っている場合あなたのキャリアスイッチ本番データベースエンジンの?:P私は、ビッグ・ボーイの企業の話ではなく、ご自分のHSの友人と始めた「起動」とあなたは最高経営責任者(CEO)だと、彼女は、真のCTO – Volte

+0

ソートだとしています。はい、あなたは通常、あなたがそうしなければ、多くのことを実用的な実装に切り替えることはありません.Twitter&Facbookは、春に心に響く主要な例です。あなたはしばらくの間、新しい設定に移行しました。 - それは私に数回起こった私は、古い時代遅れのセットアップから内部のアプリケーションを移行する必要がありました – konung

+0

@bwicklund - 。ほかの質問はActiveRecordの中のPostgreSQL&STI(レール)について、そこにあればでした答えは単純な場合を除いてSTIを処理するためのいいクリーンな方法がなかったということでした。なぜ私はその理由を説明しました。ちょうどあなたがそれが間違っているという意味ではないという答えが気に入らないからです。あなたがより良い説明を持っているなら、あなた自身の答えを自由に提供してください。 – konung

6

:次にapplication.rbにだけ行を追加します!

本当に?small print in the manualを詳しく見ましたか?例えば:

  • 固有の制約(従って、一次キー)継承レベル上ない可能です。
  • 継承されたテーブルとベーステーブルの参照は混在しません。私。 (マニュアルからおおよそ):capitalscitiesを伸ばします。 addressテーブルはcitiesを参照したいと考えています。できる。しかし、capitalのアドレスは使用できません。

これら二つのことは、小さな「Hello World」のプロジェクトを超えたもので非常に重要です。だから、PostgreSQLの継承を使用して生産性を実現できるとは想像もできません。

+1

実際に私が理解しているように、テーブルシャーディングには非常に便利です。しかし、現時点でモデル空間の継承には適していないことは事実です。 – Divide

+0

ほとんどの場合、これを使ってテーブルシャーディングを行うことはできません。複数のユニーク制約がある場合は、ネジ止めされます。また、ほとんどのフレームワークでは代理キーが使用されるため、アプリケーションデータに固有の制約が1つもないことがあります。 –

+0

もちろん、サロゲートキーを使用している場合、シャーディングはしばしば難しくなります。 PSQLドキュメントは、シャーディングの良い例があります。http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html – Divide

関連する問題