を行うことを検討あなたのBookCopy
は書籍YのX個のコピーを有することを説明するものであり、その意味で「書籍」は貸し出されていないので、それらの「コピー」は正しいのですか?
私はアクションの最良のコースはおそらくBookLoan
テーブルが多対多のテーブルでなければならないと考えていると思います。コピーは一度にメンバーに貸与されてから返されます。 BookLoad
は、コピーとメンバーのIDと貸し出し日を持つ必要があります(これはdatetimeフィールドではありませんが、varcharのものでなければなりません)&日付が返されます(貸出日付のようにdatetimeである必要があります。返されていないコピーを表すためにnullableでなければなりません)。また、メンバーが同じコピーを複数回チェックアウトできる可能性があるので、ローンの一意(おそらく自動インクリメント)IDを保持する必要があります。
私はおそらくあなたが当初、販売取引と同様に「ローン」を概念化していたと推測しています。 loanCopies
テーブルが必要で、異なるコピーが別々に返される可能性があるので、ローンでdateReturnedを使用することは望ましくありません。
編集(追加観測):それはコピーのみを使用すると、循環から本をご遠慮したい場合は、それが適切な場合があります(をチェックアウトしているかどうかに基づいている場合
isAvailable
が冗長かもしれけれども) - ISBNウィキペディアに応じて13文字(CHARバンは、いくつかの状況下では、VARCHARより少しより効率的)
でmaxes 0 - 文字列型フィールドを使用するのではなく、コピーが参照できる言語テーブルを検討するとよいでしょう。
編集(再:isAvailable): あなただけ貸し出さないコピーを見つける必要がある場合は、このような単純なクエリでは、あなたが必要とするすべてです。
SELECT *
FROM BookCopy
WHERE idBookCopy NOT IN (
SELECT idBookCopy
FROM BookLoan
WHERE dateReturned IS NULL
);
サブクエリが貸し出さコピーのリストを取得し、NOT IN
は結果でコピーがそのリストに含まれていない確認します。
コピーが貸し出されないように(破損、破損など)、isAvailable
"フラグ"は、そのような機能を追加する簡単な方法です。外部クエリのWHERE
条件にAND isAvailable = 1
を追加するだけです。
あなたは 'BookLoan'に' BookCopyId'や 'MemberId'のようなフィールドを追加する必要があります。 'dateReturned'が' NULL'の場合、それはまだ返されていないことを意味します。それ以外の場合は返されます。 –
日付フィールドにvarcharを使用しないでください。mysqlには 'date'型があります。整数型でなければなりません –