1

オブジェクトとインターフェイスを操作する場合、データベースへの書き込みのベスト プラクティスは何ですか? オブジェクトの設計に関してはいろいろな意見がありますが、データベースの終わりについてはよくわかりません。簡単な例:

連絡先の名前 (Bill、Fred、Sally) や場所 (自宅、職場など) などの共通フィールドを含む Contact 基本クラスがあるとします。IPhone インターフェイス (市外局番、電話番号、内線番号) と IEmail インターフェイス (電子メール アドレス、cc) を追加して、違いを抽出します。次に、これらを継承するクラス (Phone、Email) を次のように作成します。

    電話: 連絡先、iPhone
    電子メール: 連絡先、IEMail

別の方法として、次のように Contact 基本クラスの代わりに IContact インターフェイスを作成することもできます。

    電話: IContact、IPhone
    電子メール: IContact、IEMail

これらのオブジェクトが単一のデータベース テーブルに書き込まれている場合、NHibernate または Entity Framework を実装する以外に、データ アクセス コードのベスト プラクティスは何ですか? 私が見たものはかなりぎこちないようです。

4

5 に答える 5

3

私の経験では、データベースに関して、ある程度のパフォーマンスを実現したい場合は、優れたリレーショナル デザインを最初に行う必要があります。その後、私のモデルは非常に単純です: 1 つのテーブル、1 つのクラスです。自己参照関係がある場合は、元のクラスから直接派生する別のクラスを作成します。結合は、オブジェクトのリストとして定義されます (たとえば、注文には注文の詳細のリストがあります)。

これを理解したら、これらのクラスを反映できる DAL を使用して、必要な SQL をその場で生成します。プロファイリングの後、いくつかの SP を作成する必要があるかもしれませんが、その結果は受信側の DTO にも送信されます。

これまでのところ、インターフェイスを使用する理由はありませんでした。

于 2009-01-01T01:19:28.467 に答える
1

最初にデータベースを構築して、必要なものすべてを実際に保存できることを確認してください。次に、「すべての顧客とその主要な電話番号」や「すべての電話番号を持つ単一の顧客」などの一般的なクエリを作成します。

これにより、十分な電話番号フィールドがない、または実際の電話番号を示す方法がないなどの明らかな問題が明らかになります。

データベースは、アプリケーションの少なくとも 3 倍の寿命があり、変更するのは難しいため、最初から正しく設定するようにしてください。

于 2009-01-01T02:46:42.910 に答える
1

この 3 つのエンティティ間の関係を考慮する必要があると思います。次のステートメントを声に出して言って、アプリケーションに当てはまるものを確認してください。

  • Phone ありますContact
  • Phone ありますContact

ここに投稿した内容から、2 番目のオプションを使用することで、アプリケーションの複雑さを大幅に軽減できるように思えます。

しかし、あなたはデータ アクセスについて疑問に思っており、データベース テーブルが 1 つしかないことに言及しましContactた。コードベースの複雑さを軽減するため、データ モデルを表す単一のエンティティを含めるようにコードをリファクタリングするか、(サンプル コードに基づいて) 本当に必要と思われるものを反映するようにデータベース スキーマをリファクタリングすることをお勧めします。PhoneEmail

于 2009-01-01T01:21:45.407 に答える
1

モデル化しようとしているのは電話の連絡先と電子メールの連絡先のようですが、実際には電話または電子メールという主要な連絡方法を持つ連絡先だと思います。私がそれを構築する方法は、構成を使用することです-複数の電話番号/電子メールを柔軟に使用したい場合. それぞれの 1 つを使用できる場合は、連絡先テーブルに直接保存できます。複数のアドレスが必要な場合は、別のテーブルを使用して電話/メールと同じ方法で処理します。

連絡先テーブル
     連絡先ID
     ファーストネーム
     苗字
     MI
     住所1
     番地2
     街
     都道府県
     郵便番号
     PreferredContactMethod (0 = 電話、1 = メール)
     ... 詳細 ...

PhoneNumbers テーブル
     電話番号
     連絡先ID
     電話番号
     IsPrimary
     ...詳細...

EmailAddresses テーブル
     電子メールID
     連絡先ID
     電子メールアドレス
     IsPrimary
     ...詳細...

クラスには、1 つ以上の PhoneNumbers と 1 つ以上の EmailAddresses を含む Contact クラスがあります。電話番号や電子メール アドレスを持つ連絡先以外のものがある場合、それらが IPhoneable または IEmailable であることを示すインターフェイスを持つことは理にかなっているかもしれません。 :

public interface IPhoneable
{
     public PhoneNumber GetPrimaryNumber();
     public void AddNumber( PhoneNUmber number );
     public IEnumerable<PhoneNumber> GetNumbers();
}

public interface IEmailable
{
     public EmailAddress GetPrimaryAddress();
     public void AddEmailAddress( EmailAddress address );
     public IEnumerable<EmailAddress> GetEmailAddresses();
}

public class Contact : IPhoneable, IEmailable
{
     private List<PhoneNumber> phoneNumbers;
     private List<EmailAddresses> emailAddresses;

     public int ContactID { get; private set; }
     public string FirstName { get; set; }
     ...

     public Contact()
     {
         this.phoneNumbers = new List<PhoneNumber>();
         this.emailAddresses = new List<EmailAddress>();
     }

     public PhoneNumber GetPrimaryNumber()
     {
          foreach (PhoneNumber number in this.phoneNumbers)
          {
               if (number.IsPrimary)
               {
                    return number;
               }
          }
          return null;
      }

      ...
}

必要に応じて、PhoneableContact と EmailableContact を Contact からサブクラス化して、好みの連絡方法に基づいて区別できるようにすることもできますが、実際にはこれが必要だとは思いません。それを行った場合、Contact はどちらのインターフェイスも実装しません。サブクラスはそれぞれ適切なものを実装します。

于 2009-01-01T05:02:38.440 に答える
0

この場合... DB4O のようなデータベース オブジェクトを使用するのが最善の選択肢だと思います。

「Db4o はオープン ソースのオブジェクト データベースであり、Java および .NET の開発者はトピック マップを含む任意のアプリケーション オブジェクトを 1 行のコードで格納および取得できるため、別個の厳格なデータ モデルを事前に定義または維持する必要がなくなります。」

http://www.db4o.com/

于 2009-01-01T11:28:17.617 に答える