1

画材屋の申込書を書いています。私のシステムには、shop、cart place、rack、bakery というクラスがあります。

これらには次のプロパティがあります。

ショップ: X、Y、名前、幅、高さ、種類、住所

カートの場所: X、Y、名前、幅、長さ、タイプ、容量

ラック: X、Y、名前、幅、長さ、タイプ、高さ、balance_limit

ベーカリー: X、Y、名前、幅、長さ、タイプ、open_hours

今、データベースでこれらのクラスを表現したいと思います。しかし、ご覧のとおり、上記のすべてのクラスには次のような同じものがあります。

X、Y、幅、高さ、名前、タイプ。そして、それらの違いは次のとおりです。

ショップ:住所

カート置き場:定員

ラック: balance_limit

ベーカリー: open_hours

将来、これらすべてのタイプのオブジェクトが独自の新しいプロパティを持ち、それらすべてが一度に持つ新しいプロパティを取得することを私は知っています.

また、ショップ、カート置き場、ラック、ベーカリーと同じプロパティを持つ、上記以外の新しいタイプのオブジェクトが存在することもわかっています。

新しいプロパティと新しいオブジェクトを追加できるデータベース構造を作成したいと考えています。また、すべてのクラスに同時に追加される新しいプロパティを追加します。さらに、システムを明確に設計して、データベースへの簡単なクエリを実行できるようにしたいと考えています。

だから私の質問は:

オブジェクトのすべてのタイプ (ショップ、カート置き場、棚、ベーカリー) のデータベース テーブルを作成する必要がありますか?

あるソリューションが別のソリューションより優れている理由を教えてください。ここで、「公理だから正しい方法だからやるべきだ」だけでなく、実用的なアドバイスを得たいと思っています。

4

6 に答える 6

1

これは簡単な質問ではありません... SQL データベースは、クラス階層のモデリングが得意ではありません。

優れた ORM が必要です。

クラス階層をテーブルに入れると、次のようになります。

まず、適切であることを確認します。たとえば、Web CMS のノード、記事などを同じテーブルに配置することは理にかなっています。これらはすべて同じものの変形であるためです。

検索、インデックス作成、および SQL クエリの作成のためにデータベース列を作成する必要がありますが、すべての情報をデータベース列に格納する必要はありません。残りは BLOB 列のシリアル化されたオブジェクトに格納できます。

この表には、もちろん、この行がどのクラスのインスタンスであるかを示す列があります。すべてのクラスに共通するいくつかの「コア」列、基本的には基底クラスのフィールドがあります。- 一部のサブクラスでのみ使用されるが、検索する必要があるため、インデックスを作成する必要があるその他の列 - オブジェクトの他のすべてのデータを含む BLOB。

基本的に、オブジェクトをデータベースに保存すると、そのクラスに応じて関連する列が埋められ、残りのデータ (またはオブジェクト全体) が BLOB に押し込まれます。

これの優れた点は、検索やインデックス作成の必要がなく、格納されるだけのメンバー値を追加した場合、それをデータベース列に入れる必要がないため、データベースにまったく変更を加えないことです。 : シリアル化された BLOB に格納されます。唯一できることは、デシリアライゼーション コードにこのメンバーのデフォルト値を追加することです。そのため、既にデータベースにあり、このメンバーを持たないこのクラスのオブジェクトには、適切なデフォルト値が設定されます。

必要に応じて、オブジェクト形式をバージョン化することもできます。これはより複雑になります。

ただし、このスキームにはいくつかの欠点があります。

制約の適用が難しい : - 列を持つフィールドにのみ制約を適用できます。- 一部の列は一部のクラスでのみ発生するため、データベースはクラス階層について少し知る必要があります。

たとえば、住所を別のテーブルに配置し、関連するフィールド (郵便番号、国、通り、番号など) を追加したい場合があります。これらすべてをメイン テーブルに配置すると、列が増えすぎます。また、ある時点で、別のテーブルにあり、住所も持っているいくつかの顧客またはその他のものを追加したい場合があるため、別のテーブルに住所を入れてそれらを参照することをお勧めします。

人や企業なども同様です。

ショップには住所がありますが、カートにはありません。そのため、データベース DDL で、タイプが「ショップ」でタイプが「カート」ではない場合、テーブルの行が住所を参照する必要があることを表現する必要があります。

少し毛むくじゃらになることがあります。

また、たとえば、10 のショップと 100.000 のカートがある場合、パフォーマンスのために、テーブルを分割することは興味深いかもしれません。


今他の解決策があります:

たとえば、すべてのコードと基本メンバーを基本クラスに配置し、tableName を派生クラスで変更されるクラス属性にすることができます。このように、テーブル名を変更するだけで、すべてのコードが別のテーブルに適用されますが、書き直す必要はありません。

次に、クラスごとに 1 つのテーブルを取得します。

もちろん、クラス階層がより複雑になった場合は、上記の方法を各テーブルに適用できます。


2つの間で選択する方法?

基本的にWeb CMSを作ってテーブルに格納する場合、Nodeから派生したクラスのオブジェクトは以下のようになります: - アーティクル - 凡例付き画像 - ギャラリー - など

これらのオブジェクトはすべて基本的に同じものです。それらはすべて Title、TextContent フィールドを持ち、ParentNode に属します。

TextContent で「foo」のキーワード検索を行う場合、すべてのオブジェクトが同じテーブルにあると、はるかに簡単になります。

ParentNode のすべての子を一覧表示して Web ページに表示したい場合、すべてが 1 つのテーブルにある方がはるかに簡単です。

したがって、この場合、最初の方法は本当に利点があります。

あなたの場合、オブジェクトはそれほど似ていません。

個人的には、彼らに同じ基本クラスを与えることさえしません。「ThingWithCoordinates」という名前の Mixin を作成し (おそらくもっと短いもの)、これをクラスに追加します。

さて、ベーカリーはショップから継承できるほど近くにあるかもしれませんが、カートとラックはおそらくそうではありません。

あなたの場合、私は間違いなくいくつかのテーブルを使用します。また、各テーブルに複数のクラスを格納する必要がある場合は、最初の方法を使用します。

最も重要なことは、クラス階層 (およびテーブル) は関連するもの (カー ディーラーやベーカリーはショップ) に基づいている必要があり、実際には他に共通点がないオブジェクト (カートとショップなど) の間に存在する共通の機能ではないということです。このために、共通コードを共有する mixin がありますが、基本クラスはありません。

于 2009-08-04T09:06:35.037 に答える
1

私が提案すること:

  1. データベースの問題に関係なく、ドメイン モデルを適切に設計します。プロパティ ( nameなど) を共有するエンティティは、それらが何らかの形で関連していることを意味するものではありません。彼らはそうかもしれませんが...
  2. この設計をデータベース構造にマッピングし、よく知られているオブジェクト リレーショナル構造パターンを選択します(データベース設計を参照)。
  3. 適切な ORM ソリューション (できれば、基礎となるデータベース構造を後で変更できるソリューション) を使用して製品を開発してください。
  4. パフォーマンスの問題が発生した場合は、データベースを正規化 (非)化して問題を解決することを検討してください。
于 2009-08-04T09:51:38.833 に答える
0

「汎化特化リレーショナル モデリング」で Web を検索します。

このパターンが発生した場合の SQL データベースの設計方法に関するいくつかの優れた記事を見つけることができます。最高の記事は、規範的なルールを定めるのではなく、ガイダンスを提供するというあなたの基準に従います。

于 2009-08-04T12:29:19.343 に答える
0

共通性が shop_size に似ている場合は、そのための別のテーブルを作成することをお勧めします。

その理由は、正規化することで他の情報を取得できるため、たとえば、同じ測定値のショップが多数存在する可能性があるため、幅と長さを示すドロップダウンを簡単に作成できます。

このテーブルにあるデータを見て、後で他の情報を取得することもできます。

主に、柔軟性が得られます、IMO。

于 2009-08-04T12:38:46.723 に答える
0

はい、オブジェクトはそれぞれ独自のエンティティであるため、オブジェクトごとに 1 つのテーブルを使用する必要があります。これらのテーブルをオブジェクトにマップすると、複数のテーブルを結合する必要がなくなり、作業がより効率的になります。

また、各オブジェクトは、開発と複雑さの観点から分離されます。

于 2009-08-04T08:47:51.330 に答える
0

共通項目のテーブルを「共有」することで得られるメリットは何ですか?

何もない場合は、それを行わないでください - それらを別のテーブルに貼り付けてください (特に、それらが将来さらに分岐する場合)。

ORMを使用していないと思いますか?

于 2009-08-04T08:48:56.633 に答える