首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Zero to 1或Boolean

SQL Zero to 1或Boolean
EN

Stack Overflow用户
提问于 2011-11-17 14:52:48
回答 4查看 163关注 0票数 1

我目前正在将大量用户数据从CSV电子表格迁移到SQL数据库中,设计模式和所有这些东西。

此时,Users表如下所示:

代码语言:javascript
复制
CREATE TABLE Users
(
    id      INTEGER NOT NULL AUTO_INCREMENT,

    name        VARCHAR(48) NOT NULL,
    alias       VARCHAR(24) NOT NULL UNIQUE,
    email       VARCHAR(128) NOT NULL,

    date_of_birth   DATE,
    location    VARCHAR(24) NOT NULL,

    date_joined DATE,

    ...

    PRIMARY KEY (id)
);

我们(该集团)希望很快测试针对特定事件和文章的电子邮件订阅服务;这将通过查看数据库中的订阅人员进行管理。

我最初的想法是将一个布尔值添加到Users表中,表示他们是否订阅了,但是像这样编辑模式似乎不是一个好做法。

我的第二个想法是:

代码语言:javascript
复制
CREATE TABLE Subscribers
(
    uid     INTEGER NOT NULL,
    PRIMARY KEY (uid)
    FOREIGN KEY (uid) REFERENCES Users(id)
);

这两种方法的优点是什么?考虑到测试可能是实验性的,这将最适合我的情况。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-17 16:36:16

Subscribers表方法的优点包括:

  • 它是一个更高的--实际上是最高的--范式,是6NF;
  • 它更便携,例如,不是所有的SQL产品都有Boolean类型;

this article by Joe Celko中还有更多的原因。

不过,所发布的Subscribers表有一些缺陷。uid列应该有一个唯一的约束。自动增量列是冗余的。外键可能应该具有引用操作ON DELETE CASCADE (并且ON UPDATE CASCADE在将来可能会被证明是有用的)。

票数 1
EN

Stack Overflow用户

发布于 2011-11-17 15:03:59

哪种行动是合适的,很大程度上取决于预期的用例。如果您只能订阅一份时事通讯,那么应该首选布尔标志版本,因为使用

代码语言:javascript
复制
select * from User where subscribed = 1 

而不是连接可能很大的Subscribers表。但是,如果您可以订阅多个时事通讯,这将意味着在您的用户表中为每个时事通讯添加一列(例如subscribedToProductAnnouncementssubscribedToHolidayNewsletter等)。如果你有很多用户(几百万),如果你遇到性能问题,这可能仍然是一个选择,但除非你真的遇到了性能问题,否则使用Subscribers表会更好,因为你可以添加更多的时事通讯,而不必一直更改数据库模式。不过,这需要您使用一个字段来扩展Subscribers表:

代码语言:javascript
复制
CREATE TABLE Subscribers
(
    id      LONG PRIMARY KEY AUTO_INCREMENT,
    newsletterId INTEGER NOT NULL  -- the ID of the newsletter that the user is subscribed to
    uid     INTEGER NOT NULL,
    FOREIGN KEY (uid) REFERENCES Users(uid)
);

我也会在Subscribersid列中使用LONG,因为订阅可能来来去去,最终可能会达到INTEGER的20亿上限。也许将该表重命名为Subscriptions也是一个好主意,因为它实际上包含的是订阅而不是订阅者。

票数 3
EN

Stack Overflow用户

发布于 2011-11-17 15:00:23

你最好使用一个布尔值...再想一想,如果用户想要取消订阅,您必须将其从数据库中删除,这是一个非常糟糕的主意

此时,布尔值将更好地确定该用户是否允许您向他们发送电子邮件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8163209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档