我目前正在将大量用户数据从CSV电子表格迁移到SQL数据库中,设计模式和所有这些东西。
此时,Users表如下所示:
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表中,表示他们是否订阅了,但是像这样编辑模式似乎不是一个好做法。
我的第二个想法是:
CREATE TABLE Subscribers
(
uid INTEGER NOT NULL,
PRIMARY KEY (uid)
FOREIGN KEY (uid) REFERENCES Users(id)
);这两种方法的优点是什么?考虑到测试可能是实验性的,这将最适合我的情况。
发布于 2011-11-17 16:36:16
Subscribers表方法的优点包括:
在this article by Joe Celko中还有更多的原因。
不过,所发布的Subscribers表有一些缺陷。uid列应该有一个唯一的约束。自动增量列是冗余的。外键可能应该具有引用操作ON DELETE CASCADE (并且ON UPDATE CASCADE在将来可能会被证明是有用的)。
发布于 2011-11-17 15:03:59
哪种行动是合适的,很大程度上取决于预期的用例。如果您只能订阅一份时事通讯,那么应该首选布尔标志版本,因为使用
select * from User where subscribed = 1 而不是连接可能很大的Subscribers表。但是,如果您可以订阅多个时事通讯,这将意味着在您的用户表中为每个时事通讯添加一列(例如subscribedToProductAnnouncements、subscribedToHolidayNewsletter等)。如果你有很多用户(几百万),如果你遇到性能问题,这可能仍然是一个选择,但除非你真的遇到了性能问题,否则使用Subscribers表会更好,因为你可以添加更多的时事通讯,而不必一直更改数据库模式。不过,这需要您使用一个字段来扩展Subscribers表:
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)
);我也会在Subscribers的id列中使用LONG,因为订阅可能来来去去,最终可能会达到INTEGER的20亿上限。也许将该表重命名为Subscriptions也是一个好主意,因为它实际上包含的是订阅而不是订阅者。
发布于 2011-11-17 15:00:23
你最好使用一个布尔值...再想一想,如果用户想要取消订阅,您必须将其从数据库中删除,这是一个非常糟糕的主意
此时,布尔值将更好地确定该用户是否允许您向他们发送电子邮件
https://stackoverflow.com/questions/8163209
复制相似问题