0

この質問の焦点は、主に、ここでオブジェクト モデルを指定してリレーショナル データベース スキームを開発することです。

システムのこの部分は、リソース (さまざまな種類の従業員と請負業者) がアクティビティ (プロジェクトまたはアカウント) に行う時間ベースの割り当てに関係しています。データ エントリは毎週行われ、ドメイン モデルは毎週のエントリ (200 リソースでリソースごとに最大 5) を検証してから永続化する必要があります。データベースからのクエリは、アクティビティとリソースの両方による割り当ての承認/分析をサポートする必要があります。

私はすでに NHib (& FNH) をシステムのより単純な部分で使用しているので、私の主な焦点に付随して、これらのツールを永続化するためにドメイン モデルが行わなければならない他の譲歩を具体化することです。例:
1) そうでなければ仮想ではないプロパティは仮想です
2) ID 生成 (基本クラスとしてのエンティティは、ID (int) を生成するために自動マップされます

以下は、プレゼンテーション目的でテストされた対象のドメイン クラスです。

 public class Allocation : Entity {
    public virtual ResourceBase Resource { get; private set; }
    public virtual ActivityBase Activity { get; private set; }
  public virtual TimeQuantity TimeSpent { get  private set; }
}

public abstract class AllocatableBase : Entity {
    protected readonly IDictionary<DateTime, Allocation> _allocations = new SortedList<DateTime, Allocation>();

    public virtual IEnumerable<Allocation> Allocations { get { return _allocations.Values; } }

}

public abstract class ResourceBase : AllocatableBase {
    public virtual  string Name { get; protected set; }
    public virtual  string BusinessId { get; protected set; }
    public virtual  string OrganizationName { get; protected set; }
}

// example of a concrete ResourceBase
public sealed class StaffMemberResource : ResourceBase  {
    public StaffMember StaffMember { get; private set; }

    public StaffMemberResource(StaffMember staffMember)
    {
        Check.RequireNotNull<StaffMember>(staffMember);
        UniqueId = GetType().Name + " " + staffMember.Number; // bad smell here
        Name = staffMember.Name.ToString();
        BusinessId = staffMember.Number;
        OrganizationName = staffMember.Department.Name;
        StaffMember = staffMember;
    }
}


public abstract class ActivityBase : AllocatableBase {

    public virtual void ClockIn(DateTime eventDate, ResourceBase resource, TimeQuantity timeSpent) {
        ... add to the set of allocations if valid
    }

    public virtual string Description { get; protected set; }
    public virtual string BusinessId { get; protected set; }
}

// example of a concrete ActivityBase
public sealed class ProjectActivity : ActivityBase {
    public Project Project { get; private set; }

    public ProjectActivity(Project project) {
        Check.RequireNotNull<Project>(project);
        Description = project.Description;
        BusinessId = project.Code.ToString();
        UniqueId = GetType().Name + " " + BusinessId;
        Project = project;
    }
}

ここでフィードバックを探して、私が捨てている最初のデータベース構造を次に示します。

table Allocations (
   AllocationID INT IDENTITY NOT NULL,
   StartTime DATETIME NOT NULL,
   EndTime DATETIME NOT NULL,
   primary key (AllocationID)

      foreign key (ActivityID) 
      foreign key (ResourceID) 

)

table Activities (
   ActivityID INT IDENTITY NOT NULL,
   primary key (ActivityID)

   ActivityType NVARCHAR(50) NOT NULL,

      foreign key (WrappedActivityID) // for lack of a better name right now

)

table Projects (    // example of a WrappedActivity
    ProjectID INT IDENTITY NOT NULL,
   Prefix NVARCHAR(50) null,
   Midfix NVARCHAR(50) null,
   Sequence NVARCHAR(50) null,
   Description NVARCHAR(50) null,
   primary key (ProjectID)
)

table Resources (
   ResourceID INT IDENTITY NOT NULL,
   primary key (ResourceID)

   ResourceType NVARCHAR(50) NOT NULL,

      foreign key (WrappedResourceID) 

)

table FullTimeStaffMembers (  // example of a WrappedResource
    StaffMemberID INT IDENTITY NOT NULL,
   Number NVARCHAR(50) not null unique,
   FirstName NVARCHAR(50) not null,
   LastName NVARCHAR(50) not null,
   DepartmentID INT not null,
   primary key (StaffMemberID)
)

私はまだ特定の継承マッピングスキーム(つまり、クラスごとのテーブルなど)を狙っていません(最適なパフォーマンスではないにしても)動作する開始データベースモデルを取得しようとしています。私は、データベースのスキルが私のプログラミングスキルを比較すると素晴らしいものにしていることをすでに痛感しているので、すべての建設的なフィードバックと質問を歓迎します!

乾杯、
ベリル

4

1 に答える 1

0

あなたのテーブル構造に混乱しています。あなたは外部キーについて言及していますが、外部キーが参照するテーブルについては言及していません。ほとんどの場合、命名規則に基づいてテーブルを推測できます。SQL を使用してテーブルを作成する場合は、テーブルに関して明示的な参照を作成することをお勧めします。ほとんどの場合、スキーマで参照整合性を強制することも適切です。

しかし、WrappedResourceID と ProjectID の関係がわかりません。次の設計パターンは、いくつかの共通の属性を持つさまざまな種類のアクティビティをモデル化するのに役立つと思いますが、アクティビティの種類に固有の属性も持っています。

「汎化特化リレーショナル モデル」で Web 検索を行います。このパターンを説明する優れた記事がいくつかあります。これは、DB 設計コースの初心者では通常教えられないパターンですが、継承に慣れている人は知っておく必要があります。

于 2009-07-22T14:52:05.853 に答える