これは簡単な質問ではありません。SQLデータベースは、クラス階層のモデリングには適していません。
あなたは良いORMが必要です。私は、テーブル内のクラス階層を置く何
、んはこれです:
まず、私は確信して、それが適切であることを確認してください:例えば、同じテーブル内のWeb CMSのためのノード、記事などを置くことので、理にかなっていますこれらはすべて同じものの変種です。
考えられるのは、SQLクエリを検索、インデックス作成、および作成するためのデータベース列を作成する必要がありますが、すべての情報をデータベース列に格納する必要はありません。残りはBLOB列の直列化オブジェクトに格納できます。
テーブルには、 があります。もちろん、この行がどのクラスを表す列であるかは、 です。すべてのクラスに共通するいくつかの「コア」列、基本的には基本クラスのフィールドです。 - いくつかのサブクラスでのみ使用されているが、検索に必要な他の列です。したがって、インデックスを付ける必要があります - オブジェクトの他のすべてのデータを含むBLOBです。
データベースにオブジェクトを格納すると、そのクラスに応じた関連する列が塗りつぶされ、残りのデータ(またはオブジェクト全体)がBLOBにスクロールされます。
大きな点は、検索または索引付けする必要がないメンバー値を追加して保存しただけで、データベース列に入れる必要がないため、変更を加えないことですデータベースはまったくありません。直列化されたBLOBに格納されます。唯一行うべきことは、このメンバーのデシリアライゼーションコードにデフォルト値を追加することです。そのため、このクラスのオブジェクトはデータベースに既に存在し、このメンバを持たないため、適切なデフォルト値が設定されます。
また、必要に応じてオブジェクト形式のバージョンを変更することもできますが、複雑になります。
しかし、この方式では、いくつかの欠点があります
制約が適用するのは困難である: - あなただけの列を持っている分野に制約を適用することができます。 - 一部の列は一部のクラスでのみ発生するため、データベースはクラス階層について少し知っている必要があります。
たとえば、別のテーブルにアドレスを入力し、関連するフィールド(郵便番号、国番号、通り番号など)を追加したいとします。このすべてをメインテーブルに置くと、余分な列が追加されます。また、ある時点で、異なるテーブルにある住所や住所を持つ顧客やその他の物を追加したいので、アドレスを別のテーブルに入れて参照してください。人や企業のための
同じこと、などが
今すぐお店にはアドレスを持っていますが、あなたのテーブルから行を参照する必要があり、そのデータベースのDDLで表現する必要がありますので、カートは、私は、想定されていません住所が "店舗"のタイプであるが、 "カート"のタイプではない場合。
少し毛むくじゃらするかもしれません。
また、たとえば10店舗と100000台のカートを持っている場合は、パフォーマンスの面でテーブルを分割するのが面白いかもしれないので、すばらしい小さなテーブルと1つの大きなテーブルが得られます。
は今、他のソリューションがあります。
たとえば、あなたは、基本クラス内のすべてのコードとベースメンバーを置くが、派生クラスで変更されたtableNameのクラス属性を作ることができます。このように、テーブル名を変更するだけで、すべてのコードが別のテーブルに適用されますが、それを書き換える必要はありません。
次に、クラスごとに1つのテーブルを取得します。
もちろん、クラス階層が複雑になる場合は、上記の方法を各テーブルに適用できます。
どのように2つの間で選択しますか?あなたがウェブCMSを作り、あなたがテーブルに格納する場合、基本的に、クラスのオブジェクトは次のようにノードから派生
: - 記事 - 伝説 とイメージ - ギャラリー - など
すべてのこれらのオブジェクトは基本的に同じもの。 これらはすべてTitle、TextContentフィールドがParentNodeなどに属します
TextContentで "foo"というキーワードを検索すると、すべてのオブジェクトが同じテーブルにある場合はずっと簡単になります。
ParentNodeのすべての子をWebページに表示する場合は、すべてが1つのテーブルにある場合はずっと簡単です。
この場合、最初の方法は本当に利点です。
あなたの場合、オブジェクトは似ていません。
個人的に私はそれらに同じ基本クラスを与えることさえできません。 ミックスインの名前を「ThingWithCoordinates」(多分もっと短いもの)にして、これをクラスに追加します。
今、おそらく、おそらくそうではないかもしれないが、おそらくベーカリーはショップに近い。
私は確かにいくつかのテーブルを使用します。各テーブルで、複数のクラスを保存する必要がある場合は、最初のメソッドを使用します。
最も重要なのは、クラス階層(したがってテーブル)は、RELEVANT(自動車ディーラーやベーカリーショップ)に基づいていなければならず、実際には何も共通しないオブジェクト間に存在する一般的な機能ショップ)。このために、共通コードを共有するためのミックスインがありますが、ベースクラスはありません。私が提案する何