พิจารณาสิ่งต่อไปนี้:
entity User
{
autoincrement uid;
string(20) name;
int privilegeLevel;
}
entity DirectLoginUser
{
inherits User;
string(20) username;
string(16) passwordHash;
}
entity OpenIdUser
{
inherits User;
//Whatever attributes OpenID needs... I don't know; this is hypothetical
}
ผู้ใช้ประเภทต่าง ๆ (ผู้ใช้ที่ล็อกอินโดยตรงและผู้ใช้ OpenID) แสดงความสัมพันธ์ IS-A กล่าวคือผู้ใช้ทั้งสองประเภทเป็นผู้ใช้ ตอนนี้มีหลายวิธีที่สิ่งนี้สามารถแสดงใน RDBMS:
วิธีที่หนึ่ง
CREATE TABLE Users
(
uid INTEGER AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
privlegeLevel INTEGER NOT NULL,
type ENUM("DirectLogin", "OpenID") NOT NULL,
username VARCHAR(20) NULL,
passwordHash VARCHAR(20) NULL,
//OpenID Attributes
PRIMARY_KEY(uid)
)
วิธีที่สอง
CREATE TABLE Users
(
uid INTEGER AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
privilegeLevel INTEGER NOT NULL,
type ENUM("DirectLogin", "OpenID") NOT NULL,
PRIMARY_KEY(uid)
)
CREATE TABLE DirectLogins
(
uid INTEGER NOT_NULL,
username VARCHAR(20) NOT NULL,
passwordHash VARCHAR(20) NOT NULL,
PRIMARY_KEY(uid),
FORIGEN_KEY (uid) REFERENCES Users.uid
)
CREATE TABLE OpenIDLogins
(
uid INTEGER NOT_NULL,
// ...
PRIMARY_KEY(uid),
FORIGEN_KEY (uid) REFERENCES Users.uid
)
วิธีที่สาม
CREATE TABLE DirectLoginUsers
(
uid INTEGER AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
privlegeLevel INTEGER NOT NULL,
username VARCHAR(20) NOT NULL,
passwordHash VARCHAR(20) NOT NULL,
PRIMARY_KEY(uid)
)
CREATE TABLE OpenIDUsers
(
uid INTEGER AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
privlegeLevel INTEGER NOT NULL,
//OpenID Attributes
PRIMARY_KEY(uid)
)
ฉันเกือบแน่ใจว่าวิธีที่สามเป็นวิธีที่ผิดเพราะไม่สามารถทำการเชื่อมต่อกับผู้ใช้ที่อื่นในฐานข้อมูลได้
ตัวอย่างโลกแห่งความจริงของฉันไม่ใช่ผู้ใช้ที่มีตัวอย่างการเข้าสู่ระบบที่แตกต่างกัน ฉันสนใจวิธีการสร้างแบบจำลองความสัมพันธ์นี้ในกรณีทั่วไป