Database-Design

建模可選列

  • March 21, 2022

我的一張桌子上有一個可選列(住宅),這給我帶來了麻煩。如果被許可人打算與住宅客戶一起工作,他們需要參加額外的課程(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    |     |     |     |
       +-----+-----+-----+

並填寫連接謂詞的預期結果

引用自:https://dba.stackexchange.com/questions/144719