数据库设计 - 可空字段

时间:2012-08-21 08:41:21

标签: sql database postgresql database-design

一个'最佳实践'问题,因为我是数据库设计的新手,我想确保我在这个轨道的正确轨道上

我有3种用户类型,用户(单人),组(大量用户)和公司(许多组),每个都有自己的登录,允许他们发布消息。所以,例如。如果公司发布消息,它将显示在所有链接的用户新闻源中。

为了达到这个目的,我有一个表'messages'来存储消息内容,以及用于链接用户类型的外键

我打算使用以下架构(PostgreSQL)来实现这个目标......

create table notifications(
    notification_id serial primary key,
    user_id integer references users,
    group_id integer references groups,
    company_id integer references companies,
    date_created timestamp not null default now(),
    title_id text not null,
    message_id text not null,
    icon text not null default 'logo'
);
comment on table notifications is 'Messages to be displayed on a users home feed';

这将允许我构建一个查询,为用户新闻源提取相关消息(例如,只有一个字段user_id,group_id或company_id将有一个值)

但这是最好的方法吗?我确信拥有可以为空的外键是一个坏主意,我以为可能有一个更好的解决方案使用一种枚举键? (这甚至存在吗?!)

由于

1 个答案:

答案 0 :(得分:4)

高度规范化的一个选项是使表更像

create table notifications( 
    notification_id serial primary key, 
    date_created timestamp not null default now(), 
    title_id text not null, 
    message_id text not null, 
    icon text not null default 'logo' 
); 

create table usernotifications
(
    notification_id integer references notifications,
    user_id integer references users
);

create table groupnotifications
(
    notification_id integer references notifications,
    group_id integer references groups
);

create table companynotifications
(
    notification_id integer references notifications,
    company_id integer references companies
);

其中条目仅存在于任何给定通知的相关(用户/公司/组)通知表中。

(我认为在可指定外键是可选的情况下可空外键没有任何问题,但是类似类型的多个外键确实给出了非规范化设计的印象)