Lev*_*ell 6 mysql database-design
我正在构建一个站点,该站点实现了 David Allen 的“完成任务”,该站点可以接收您的电子邮件、Facebook 新闻源、您在 Twitter 上关注的人的推文,并且计划提供更多服务。问题是我不是 DBA,我不确定如何设计数据库,以便在向站点添加功能时,我不必为了存储它而人为地破坏人们的原始数据(例如,我想在将来的某个时候添加获取 RSS 提要的功能,但我不确定如何做到这一点而不会弄得一团糟)。
我已经使用 DBDesigner 4 记下了我的初步想法,下面是图表和 SQL。
一些注释有助于澄清事情。
有人可以指出我正确的方向吗?如果建议,我也愿意考虑使用 NoSQL 数据库。感谢您的时间和考虑。
这是 SQL 创建脚本,以防万一有人想看到它。
CREATE TABLE Pop3 (
domain VARCHAR NOT NULL,
host VARCHAR NULL,
port INTEGER UNSIGNED NULL,
ssl BOOL NULL,
PRIMARY KEY(domain)
)
TYPE=InnoDB;
CREATE TABLE Imap (
domain VARCHAR NOT NULL,
Host VARCHAR NULL,
port INTEGER UNSIGNED NULL,
ssl BOOL NULL,
PRIMARY KEY(domain)
)
TYPE=InnoDB;
CREATE TABLE users (
Username VARCHAR NOT NULL AUTO_INCREMENT,
email VARCHAR NULL,
password_2 VARCHAR NULL,
activation VARCHAR NULL,
is_active BOOL NULL,
PRIMARY KEY(Username)
)
TYPE=InnoDB;
CREATE TABLE smtp (
domain VARCHAR NOT NULL,
host VARCHAR NULL,
port INTEGER UNSIGNED NULL,
ssl BOOL NULL,
PRIMARY KEY(domain)
)
TYPE=InnoDB;
CREATE TABLE projects (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
users_Username VARCHAR NOT NULL,
name VARCHAR NULL,
description TEXT NULL,
context INTEGER UNSIGNED NULL,
PRIMARY KEY(id, users_Username),
INDEX projects_FKIndex1(users_Username),
FOREIGN KEY(users_Username)
REFERENCES users(Username)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
-- ------------------------------------------------------------
-- This is the table where access info for facebook, twitter, and others is stored.
-- ------------------------------------------------------------
CREATE TABLE Accountsi (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
users_Username VARCHAR NOT NULL,
owner INTEGER UNSIGNED NULL,
service VARCHAR NULL,
username VARCHAR NULL,
send INTEGER UNSIGNED NULL,
receive INTEGER UNSIGNED NULL,
info TEXT NULL,
PRIMARY KEY(id, users_Username),
INDEX Accountsi_FKIndex1(users_Username),
FOREIGN KEY(users_Username)
REFERENCES users(Username)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
CREATE TABLE EmailConfiguration (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
users_Username VARCHAR NOT NULL,
owner INTEGER UNSIGNED NOT NULL,
address VARCHAR NULL,
psswd VARCHAR BINARY NULL,
domain VARCHAR NULL,
PRIMARY KEY(id, users_Username),
INDEX EmailConfiguration_FKIndex1(users_Username),
FOREIGN KEY(users_Username)
REFERENCES users(Username)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
CREATE TABLE Messages (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
users_Username VARCHAR NOT NULL,
message_id VARCHAR NULL,
user_id VARCHAR NULL,
account INTEGER UNSIGNED NULL,
service VARCHAR NULL,
project INTEGER UNSIGNED NOT NULL,
context INTEGER UNSIGNED NOT NULL,
PRIMARY KEY(id, users_Username),
INDEX Messages_FKIndex1(users_Username),
FOREIGN KEY(users_Username)
REFERENCES users(Username)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
CREATE TABLE context (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
projects_id INTEGER UNSIGNED NOT NULL,
projects_users_Username VARCHAR NOT NULL,
users_Username VARCHAR NOT NULL,
name VARCHAR NULL,
description TEXT NULL,
PRIMARY KEY(id, projects_id, projects_users_Username, users_Username),
INDEX context_FKIndex1(projects_id, projects_users_Username),
INDEX context_FKIndex2(users_Username),
FOREIGN KEY(projects_id, projects_users_Username)
REFERENCES projects(id, users_Username)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(users_Username)
REFERENCES users(Username)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
数据库中没有唯一约束是否有原因?如果您以某种方式获得同一电子邮件地址的两行配置数据,会发生什么情况?您如何确定使用哪一个?
我认为我可以给您的一条真正的建议是查看键/功能依赖性并添加尽可能多的有意义的独特约束。稍后删除唯一约束比添加它们要容易得多。
归档时间: |
|
查看次数: |
1598 次 |
最近记录: |