Database-Design
建模可選列
我的一張桌子上有一個可選列(住宅),這給我帶來了麻煩。如果被許可人打算與住宅客戶一起工作,他們需要參加額外的課程(course_topic_code C):
CREATE TABLE Licensees ( license_num INTEGER PRIMARY KEY, license_level VARCHAR(50) NOT NULL, residential BOOLEAN ); INSERT INTO Licensees VALUES (123, 'Salesperson', NULL), (234, 'Salesperson', TRUE), (567, 'Salesperson', FALSE); CREATE TABLE Course_Requirements ( PRIMARY KEY (license_level, residential, course_topic_code), license_level VARCHAR(50) NOT NULL, residential BOOLEAN, course_topic_code CHARACTER NOT NULL, required_minutes INTEGER NOT NULL ); INSERT INTO Course_Requirements VALUES ('Salesperson', true, 'C', 90), ('Salesperson', true, 'A', 180), ('Salesperson', false, 'A', 180), ('Broker', true, 'C', 90), ('Broker', true, 'A', 180), ('Broker', false, 'A', 180);
問題是,我不知道被許可人是否打算為住宅客戶提供服務是有效的。如果該列為真,則他們需要參加該課程,但如果為假或空,則不需要。這是我為查看每個被許可人的必修課程而提出的查詢:
select l.license_num, cr.course_topic_code, cr.required_minutes from Course_Requirements cr join Licensees l on cr.license_level = l.license_level and cr.residential = l.residential;
如您所見,住宅為 NULL 的被許可人沒有必修課程:
567;"A";180 234;"C";90 234;"A";180
我也許可以設計一個查詢來滿足我的需求,但我覺得我可能對事物進行了錯誤的建模。我通常會盡量避免可以為空的欄位,但在這種情況下它似乎是合適的。有沒有更好的方法來建模這個?
我不清楚這個問題,但這可能是你要找的
select l.license_num, cr.course_topic_code, cr.required_minutes from Course_Requirements cr join Licensees l on cr.license_level = l.license_level and cr.residential = isnull(l.residential,1);
我對這個問題並不完全清楚,但你可以嘗試:
select l.license_num, cr.course_topic_code, cr.required_minutes from Course_Requirements cr join Licensees l on cr.license_level = l.license_level and coalesce(cr.residential, true) = coalesce(l.residential,true);
發佈如下真值表可能是個好主意:
true false null +-----+-----+-----+ true | | | | false | | | | null | | | | +-----+-----+-----+
並填寫連接謂詞的預期結果