相关疑难解决方法(0)

每个表都应该有一个单字段代理/人工主键吗?

我了解代理/人工密钥的一个好处 - 它们不会改变,而且非常方便。无论它们是单场还是多场,都是如此——只要它们是“人造的”。

但是,有时将自动递增的整数字段作为每个表的主键似乎是一个策略问题。拥有这样一个单字段键是否总是最好的主意,为什么(或为什么不)?

需要明确的是,这个问题不是关于人工 vs 自然的——而是关于是否所有人工键都应该是单字段的

database-design primary-key surrogate-key

36
推荐指数
3
解决办法
5875
查看次数

如何将 IS-A 关系映射到数据库中?

考虑以下:

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
}
Run Code Online (Sandbox Code Playgroud)

不同类型的用户(直接登录用户和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)
)
Run Code Online (Sandbox Code Playgroud)

方式二

CREATE TABLE Users
(
    uid INTEGER …
Run Code Online (Sandbox Code Playgroud)

database-design

26
推荐指数
2
解决办法
3万
查看次数