SQL Server 2008を使用するII6でASP.Net-MVC3を使用するWebアプリケーションに取り組んでいます。プロジェクトの詳細を説明できないため、この質問の目的のために、ライブラリ用であるとしましょう。本があり、人々はこれらの本をチェックアウトすることができます。過去のチェックアウトチェックアウトの記録を残したいと思います。したがって、データスキーマは次のとおりです。
Books Checkouts
------------------- ----------------------------
| ID (PK) | | ID(PK) |
| Title varchar(50)| | BookId (FK Books.ID) |
| | | CheckoutDate (DateTime) |
| ... | | ExpirationDate (DateTime)|
| | | Username (varchar(50) |
| | | ... |
------------------- ----------------------------
チェックアウトとブックの関係は多対1であるという考え方ですが、「アクティブ」または「期限切れなし」になるチェックアウトは1つだけです。つまり、ブックごとに最大で1つのチェックアウトの有効期限が現在よりも長くなります。時間。アプリケーションはこれを強制します。
私の最初の質問は次のとおりです。これは、前述の要件に適したデータベース設計だと思いますか?または、「期限切れ」のブール列をチェックアウトテーブルに含める必要がありますか?他のアイデア?
MVCのモデルは次のようになります。
public class Book {
public int ID { get; set; }
public string Title{ get; set; }
...
}
public class Checkout {
public int ID { get; set; }
public int BookID { get; set; }
public sting Username { get; set; }
public DateTime CheckOutDate{ get; set; }
public DateTime ExpirationDate { get; set; }
...
}
データアクセス層では、SqlCommandやSqlDataReaderなどのSystem.Dataクラスを使用しているだけなので、RelationshipsやLazy LoadingなどのEF、LinqToSqlなどの利点はありません。
私の問題は、これらの本を検索して、次のようなテーブルを表示したいということです。
Title Checked Out Checked Out By Check Out Expiration
-------- ----------- -------------- ----------------------
Book1 Yes Username 01/01/1970
この情報を取得するためのクエリは次のようになります
SELECT *
FROM Books
LEFT JOIN Checkouts ON Checkouts.BookID = Book.Id
WHERE Checkouts.ExpirationDate <= GETDATE()
どうすればいいですか?
このようなモデルを作りませんか
public class BookSearchTableRow {
public string Title { get; set;}
public bool CheckedOut { get; set;}
public string CheckedOutBy { get; set;}
public DateTime CheckOutExpiration { get; set;}
}
ビューにリストを作成させますか?
または、BookモデルにCheckOutプロパティを追加する必要がありますか?
public class Book {
public int ID { get; set; }
public string Title{ get; set; }
... Other Book Fields ...
public Checkout ActiveCheckout { get; set; }
}