React + MobX + Electron + Node.js + MongoDB 全棧項目開發實踐(五)數據庫設計

本節重點記錄一下數據庫的設計。mongodb

考慮到數據之間不會有太多的關聯,決定使用 MongoDB。這樣在後端與數據庫通訊時就有兩種主要方式:使用 mongodb 或者 Mongoose。參考了這篇文章,比較了一下二者的異同。咱們的數據不會很複雜,而且但願更便捷地管理數據,這種狀況下 Mongoose 更加適合。數據庫

對於這個項目來講,主要的表有 4 個:json

  • tasks 記錄任務信息
  • scores 用戶總分
  • logs 用戶的打卡記錄
  • users 用戶信息

詳細字段: tasks後端

{
    "taskId": 1,
    "userId": 0,
    "name": "Fruit",
    "desc": "Eat fruit every day",
    "type": "task",
    "isOneTime": false,
    "score": 2,
    "maxTimes": 3,
    "timesUsedToday": 2,
    "createdAt": 1573404126959,
    "lastUpdatedAt": 1573404126959
}
複製代碼

在建立 Mongoose 的 Schema 時代碼以下:數據庫設計

// define task schema
const taskSchema = mongoose.Schema({
  userId: { type: String, required: true },
  taskId: { type: Number },
  name: { type: String, required: true },
  desc: { type: String, required: true },
  type: { type: String, required: true },
  isOneTime: { type: Boolean, required: true },
  score: { type: Number, required: true },
  maxTimes: { type: Number, required: true },
  timesUsedToday: { type: Number, required: true },
  createdAt: { type: Date, required: true },
  lastUpdatedAt: { type: Date, required: true }
})
複製代碼

設置taskId 自增,須要使用 mongoose-auto-increment 插件mongoose

// ... 文件頂端引入庫的代碼
// define task schema

taskSchema.plugin(autoIncrement.plugin, {
  model: 'TaskModel',
  field: 'taskId',
  startAt: 0
});
複製代碼

這樣設置好後,每次寫入新的 task 其中的 taskId 都會自增。post

logs、 scores 和 users 差不太多。ui

其實這樣的設計有一些冗餘。由於 task 和 user 一一對應,score 和 user 一一對應,能夠只保留 tasks 集合中的 score。spa

在數據庫設計好以後,就能夠着手開發後端功能了。後端開發過程會在下一篇文章中記錄。插件

系列文章:

React + MobX + Electron + Node.js + MongoDB 全棧項目開發實踐(零)前言

React + MobX + Electron + Node.js + MongoDB 全棧項目開發實踐(一)

React + MobX + Electron + Node.js + MongoDB 全棧項目開發實踐(二)容許 decorator

React + MobX + Electron + Node.js + MongoDB 全棧項目開發實踐(三)使用 MobX 實現流暢數據流

React + MobX + Electron + Node.js + MongoDB 全棧項目開發實踐(四)—— API 設計

相關文章
相關標籤/搜索