为存储来自多个服务的内容的站点设计数据库?

Lev*_*ell 6 mysql database-design

我正在构建一个站点,该站点实现了 David Allen 的“完成任务”,该站点可以接收您的电子邮件、Facebook 新闻源、您在 Twitter 上关注的人的推文,并且计划提供更多服务。问题是我不是 DBA,我不确定如何设计数据库,以便在向站点添加功能时,我不必为了存储它而人为地破坏人们的原始数据(例如,我想在将来的某个时候添加获取 RSS 提要的功能,但我不确定如何做到这一点而不会弄得一团糟)。

我已经使用 DBDesigner 4 记下了我的初步想法,下面是图表和 SQL。

一些注释有助于澄清事情。

  • Accounts 表用于存储 facebook、twitter 等的身份验证令牌。
  • 消息表不完整。
  • emailconfiguration 和 users 中的密码字段是加密的,users 使用单向哈希,emailconfiguration 使用双向哈希。
  • 我正在使用 Amazon RDS 上的 InnoDB 存储引擎使用 MySQL 数据库。
  • 每个项目可能有一个与之关联的上下文。
  • 每条消息可能有一个项目和上下文,但这不是必需的。
  • imap、smtp 和 pop3 表的存在是为了删除电子邮件配置中的重复项。
  • 对该数据库的查询由clojure 库Korma生成。

有人可以指出我正确的方向吗?如果建议,我也愿意考虑使用 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)

Chr*_*ers 2

数据库中没有唯一约束是否有原因?如果您以某种方式获得同一电子邮件地址的两行配置数据,会发生什么情况?您如何确定使用哪一个?

我认为我可以给您的一条真正的建议是查看键/功能依赖性并添加尽可能多的有意义的独特约束。稍后删除唯一约束比添加它们要容易得多。