これは図書館管理システム用です。
私は2つのテーブルを持っています、1つはBooks
フィールド付きですBookId, Title, AuthorId, PublisherId, ISBN, ISBN13, PublishedOn, NumberOfPages, etc etc.
その他はBookTransactions
、フィールドを使用して、任意の学生に発行された、または任意の学生から受け取った本のすべてのトランザクションを含むものです。TransactionId, BookId, IssuedOn, IssuedTo, ReceviedOn, etc. etc.
問題は、私がこの本を持っていてThe God Delusion
、200部あるとしましょう。テーブルのエントリは次のBooks
ようになります
7 The God Delusion 21 32 0618680004 978-0618680009 .....
8 The God Delusion 21 32 0618680004 978-0618680009 .....
9 The God Delusion 21 32 0618680004 978-0618680009 .....
10 The God Delusion 21 32 0618680004 978-0618680009 .....
.
.
.
(200行)。他のすべてはまったく同じです。各本に200のエントリがあるだけです。これで、という名前の列を作成できることがわかりましQuantity
たが、これを聞いてください(それが質問の理由です)
しばらくするとテーブルBookTransactions
はこんな感じになるかもしれません
1 9 4/3/2012 ABC __
2 10 4/3/2012 PQR __
3 7 4/3/2012 XYZ 7/3/2012
したがって、3冊の「神の妄想」の本が同じ日に発行されたことを明確に示しています。利点は、ブック番号7が発行されているかどうかを確認できることです。発行されていない場合は、次のように発行できます。
sqlCommand.CommandText = "SELECT Count(*) FROM BookTransactions WHERE BookId=7 AND ReceivedOn is NULL";
// if a book is received, its in library and can be issued again
if (Int32.Parse(sqlCommand.ExecuteScalar().ToString()) == 0)
bookInstance.IssueThisBook();
else
MessageBox.Show("This book is already issued to someone, please select a different book");
ここで、列の数量を持つことの問題は、Books
テーブルが次のようになったかどうかということです。
7 The God Delusion 21 32 0618680004 978-0618680009 ..... 200
// the last one indicates quantity
今のエントリは次のBookTransaction
ようになります
1 7 4/3/2012 ABC __
そして今、このコードを実行すると、
sqlCommand.CommandText = "SELECT Count(*) FROM BookTransactions WHERE BookId=7 AND ReceivedOn is NULL";
// if a book is received, its in library and can be issued again
if (Int32.Parse(sqlCommand.ExecuteScalar().ToString()) == 0)
bookInstance.IssueThisBook();
else
MessageBox.Show("This book is already issued to someone, please select a different book");
1部しか発行されておらず、ライブラリにはまだ199部が残っているにもかかわらず、その本が誰かに発行されていることが示されます。
これを克服する方法はたくさんあることを私は知っています。私が考えることができる1つの方法は、このようなことをすることです。
sqlCommand.CommandText = "SELECT Count(*) FROM BookTransactions WHERE BookId=7 AND ReceivedOn is NULL";
sqlCommandOther.CommandText = "SELECT Quantity FROM Books WHERE Bookid=7"
// if the count is not equal to total quantity then there are some books availabe in libray
if (Int32.Parse(sqlCommand.ExecuteScalar().ToString()) != Int32.Parse(sqlCommandOther.ExecuteScalar().ToString()))
bookInstance.IssueThisBook();
else
// all books are currently issued
MessageBox.Show("All copies of this book are already issued, please select a different book");
ええと、これが私が考えることができる唯一の方法ですが、これは効率的ではないことを知っています。200部あるという理由だけで、本に200行あるというこの冗長性を取り除くことができる別の方法があるのでしょうか。(そして、前の段落で説明した以外の方法を意味します。)私がやろうとしていることを達成するための最良の方法は何でしょうか。
私は自分自身を明確にしたいと思います。
StarPilotのポイントを編集することは注目に値します。本当に200の異なる行/レコードが必要ですか?彼が指摘したように、特定の本、たとえば#50が紛失または破損していないかどうかを追跡するにはどうすればよいですか?これを部分的に取り入れると、冗長性が必要なように見えますよね?