質問

Iは、オブジェクト指向プログラミングにおけるスーパーのように動作DB(Postgresはベース)のテーブルを持っています。これは、追加の列がテーブルに存在しなければならない決定列「タイプ」、(サブクラスのプロパティ)を有しています。しかし、私は、テーブルには、すべての可能な列(可能なすべての種類のすべてのプロパティ)を含める必要はありません。

私は、オブジェクトのすべての可能なプロパティが含まれている「キー」と「値」の列(すなわち、「ファイル名」=「/ファイル」、または「some_valueを」=「5」)、containg、テーブルを作ることにしたので、スーパークラスのテーブルに含まれていません。そしてまた、利用できる「キー」の値を格納する1つの関連テーブルを作っています。

しかし、このようなアーキテクチャに問題があります - 「値」列には何が含まれていることができるように、デフォルトでは文字列データ型でなければなりません。しかし、私は文字列にしてから変換することは良い決断だとは思いません。この制限を回避するための最良の方法は何ですか?

役に立ちましたか?

解決

あなたがで実験しているデザインは、エンティティ - 属性値の変化です、およびそれが問題と非効率性の全体の多くが付属しています。それはあなたが最後の手段として以外、何をやっているために良い解決策はありません。

あなたのサブタイプのそれぞれについて、「サブタイプ」の表を作成します。

何より良い解決策はfallen888を説明するものである可能性があります。あなたが持っているもののように聞こえるのサブタイプの有限数を、持っている場合、これは大丈夫です。次に、あなたのサブタイプ固有の属性は、データ型を持っている、ともあなたはEAVのデザインを使用している場合は不可能であるNOT NULL制約適切な場合、することができます。

サブタイプのテーブル設計の1つの残りの弱点は、あなたが行がスーパークラスのテーブルの主な行はそれが必要と言う理由だけで、サブタイプのテーブルに存在することを強制することができないということです。しかし、それはEAVの設計によって導入されたものよりも穏やかな弱点です。

編集のコメント-to-anyの実体についての追加情報に関しては、はい、これはかなり一般的なパターンです。多くの人々は、このような状況で使用する技術である「ポリモーフィックな関連」と呼ばれる壊れたソリューションの用心ます。

他のヒント

これはどう代わりに...各サブタイプは、独自のDBテーブルを取得します。そして、ベース/スーパーテーブルはただのサブタイプのDBテーブルの名前を保持しているvarchar列を持っています。そして、あなたはこのような何かを持つことができます...

Entity
------
ID
Name
Type
SubTypeName   (value of this column will be 'Dog')


Dog
---
VetName
VetNumber
etc
あなたは(サブ)テーブル名がベーステーブルのvarchar型の値にしたくない場合は、

、あなたはまた、単にその主キーベーステーブルになりますサブタイプのテーブルを持つことができます。

(あなたの構造を保持したまま)唯一の回避策は、別のテーブルを持つことです。

create table IntProps(...);
create table StringProps(...);
create table CurrencyProps(...);

しかし、私は、これは良いアイデアだと思いません...

1つの一般的なアプローチは、すなわち等STRINGVALUE、DecimalValue、キーと値のテーブルを有する複数の列を含む、各データ・タイプの一つである。

ちょうどあなたが変更する必要はありません。あなたは、データベーススキーマのためのqueryabilityとパフォーマンスを取引している知っています。また、ORMマッピングまたはオブジェクトデータベースを検討することもできます。

あなたはタイプごとにキー/値のテーブルを持つことができます。使用可能なテーブルが正しく入力されたキー/値テーブルを指すように特定のキー/タイプのペアの可用性をエンコードする必要があります。

しかし、これは、リレーショナル・データベースをベース行の中の非常に非効率的建築のように思えます。

おそらくあなたは、列指向リレーショナルデータベースを見てみる必要がありますか?

答えてくれてありがとう。私は、より具体的には私が必要なものを少し説明します。 そこのブログ+フォーラムのウェブサイトをプログラムする必要があります、と私は WordPressのDB構造のを見てきましたます。

ブログエントリのような「オブジェクト」、またはそれへのビデオの添付ファイルのいずれかの種類にコメントを配置する機能が強く求めがあります。スケーリングすると、すべての我々のニーズを満たすために非常に容易である上記のDBの構造は、その選択の理由だった。

しかし、それは、これは初期のエンジニアリングの段階にある原因と、それを変更する遅くはありません。また、我々のモデルは完全にツリー階層ベースのDBようになりました臭いです。今の私は、ビルKarwinのとfallen888答えをhref="https://stackoverflow.com/questions/351214/optimal-db-structure-for-additional-fields-entity#351352">

ユーザーがテーブルに新しいフィールドを追加することができることについてます:

私は、コメントをするすべてのこれらの人々を感心ます。

私は数年前にこの種のものに興味があるために使用されるが、(PHPとMySQLの少し離れて)最近、少しのコードを書かれています。

あなたが何か新しいことになっている可能性があります。

-

私はあなたが行く維持したい場合は、それは罰金だと思います。 スキーム上の任意の冷たい水を注ぐために

申し訳ありません - 私はあなたの努力を賞賛します。私の個人的な信念は、あなたがこの方向に十分行けば、あなたはSQLが行うよりも、自然言語の多くを解釈するシステムで終わるだろうということです。 (1970年頃、SQLは、実際に続編が綴られた、そしてそれは実際には「構造化された英語のクエリ言語」のために立っていたが、彼らは1970年代に、それを標準化した後 - 私は誰かが、Oracleは最初の商用実装、19079、「英語」だった得たことを言ったと思います私は、彼らはそれが英語のほんの一部であると判断しました推測するので、脱落ます。

私は仕事を持っていないので、

私は、この領域で蒸気が不足しています。私はこれらのアイデアを試してみることができ手形を、支払う簡単な仕事がなければ、それはこの地域に集中して少し難しいます。

ベストすべてに願います。

申し訳ありませんが、私は今年1979年OracleはCIAのためにデータベースを書い彼らの最初の契約を得たもので、上記の19079を書いています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top