書籍の発行先のIDを含むBOOK_Issueテーブルを作成しています。私は列名を持っていますuser_idwitchにはtbl_studentとtbl_facultyからのIDが含まれます。したがって、2つの主キー列を参照してbook_issueテーブルのuser_idフィールドを設定する方法。
4 に答える
データベーススキーマが正しくありません。
一意のIDが必要な場合は、それらを1つのテーブルに含める必要があります。
すべてのユーザーを含むテーブルを作成し、ユーザーのタイプ(学生、教員)を設定するための列を作成できます。次に、タイプごとに2つの異なるテーブルを作成し、タイプに基づいてユーザーごとに適切な情報を提供します。
タイプ「学生」またはタイプ「教員」のいずれかになる「個人」スーパークラスを作成します。代わりに表からこれを参照してください。BOOK_Issue
基本的に、この関係を作成するには、「学生」と「教員」の両方にまたがる 1 つの一意の ID が必要です。これをテーブル ( tbl_person
?) に入れ、各行にこの新しいテーブルtbl_student
を参照させます。次に、両方にtbl_faculty
存在するフィールドを引き出して、代わりにこの新しいスーパーテーブルに配置することもおそらく最善です。tbl_student
tbl_faculty
この問題は、BOOK_Issue テーブルの user_id の横に追加の列を作成することで解決できます。この列は、これが学生 ID であるか教職員 ID であるかを示します。
別の方法として、ID 自体にその性質を示す何らかのパターンを容易に含めることができます (たとえば、すべての教員 ID が「UC」で始まるわけではなく、学生 ID のどれもがそうではありません)。
上記の 2 つのソリューションでは、次のようなクエリを使用できます。
SELECT B.*,
CASE B.BorrowerType -- could be LEFT(user_id, 2) etc...
WHEN 'S' THEN S.Name
WHEN 'F' Then F.Name
END As Name,
CASE B.BorrowerType
WHEN 'S' THEN S.PhoneNumber
WHEN 'F' Then F.Phone -- Note that these constructs allow
-- mapping distinct columns names etc.
END As PhoneNr
FROM BOOK_Issue B
LEFT JOIN tbl_student S ON B.BorrowerType = 'S' AND B.user_id = S.id
LEFT JOIN tbl_faculty F ON B.BorrowerType = 'F' AND B.user_id = F.id
WHERE B.DueDate < '11/23/2009' -- or some other condition
学生/教職員テーブルから複数の列を取得する必要がある場合、これは少し重くなります。可能な代替手段はUNIONですが、これにより検索句が繰り返されます。
最後に、すべての DBMS で利用できるわけではありませんが、最善の解決策は、「IF B.BorrowerType = 'S'」条件によって駆動されるサブクエリです。
これはあなたのテーブルデザインでなければなりません:
TeacherTable (FacultyID、FacultyName) StudentsTable (StudentID、StudentName、FacultlyID、...) BookTable (BookID、BookName、...) UsersTable(UserID、UserName、UserPassword、StudentID、LastLogin、...)
これが主なものです:
BookIssedTable(BookIssedID, BookID, UserID) //このテーブルは、「BookID の書籍が "UserID" のユーザーに発行されたことを示しています。//これは初期設計から大幅に改善されたため、改善される可能性があります。