निम्नलिखित को धयान मे रखते हुए:
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
}
विभिन्न प्रकार के उपयोगकर्ता (डायरेक्ट लॉगिन उपयोगकर्ता, और ओपनआईडी उपयोगकर्ता) आईएस-ए संबंध प्रदर्शित करते हैं; अर्थात्, दोनों प्रकार के उपयोगकर्ता उपयोगकर्ता हैं। अब, आरडीबीएमएस में यह प्रतिनिधित्व करने के कई तरीके हैं:
रास्ता एक
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)
)
मैं लगभग निश्चित हूं कि तीसरा तरीका गलत तरीका है, क्योंकि डेटाबेस में कहीं भी उपयोगकर्ताओं के खिलाफ एक सरल जुड़ाव करना संभव नहीं है।
मेरा वास्तविक विश्व उदाहरण विभिन्न लॉगिन उदाहरण वाले उपयोगकर्ता नहीं हैं; मैं इस मामले में सामान्य स्थिति में कैसे संबंध बनाना चाहता हूं।