Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

数据大师开篇:Mongodb的数据类型真的是JSON吗? #17

Open
e2tox opened this issue Dec 19, 2018 · 0 comments
Open

数据大师开篇:Mongodb的数据类型真的是JSON吗? #17

e2tox opened this issue Dec 19, 2018 · 0 comments

Comments

@e2tox
Copy link
Owner

e2tox commented Dec 19, 2018

前言

大家都知道使用 Mongodb 来查询数据返回的结果是JSON对象,很多框架又给这些对象加上 JSON Schema 来验证这个对象是不是符合定义,这样搞来搞去,那不就搞成MySQL了吗?这样来使用NoSQL数据和SQL数据库又有什么差别呢?你是不是有这样的疑问?带着这些疑问我们看下面一个例子

引子

我们要设计一个账单系统,需要包含:电费账单、水费账单、宽带费账单一共3种账单,每种账单都有不同的属性,字段也不一样,但是,都包含有账单名称、账单金额和最后缴费期限三个字段。你该如何设计这个数据库?是用MySQL好呢?还是用Mongodb好呢?

当然林老师这里肯定就不会用MySQL了,要不然标题就不叫Mongodb了

先看看interface是怎么设计的

interface Invoice {
  name: string
  amount: number
  dueDate: Date
}

interface ElectricityInvoice extends Invoice {
  kwh: number
}

interface WaterInvoice extends Invoice {
  ton: number
}

interface HomeBroadbandInvoice extends Invoice {
  bandwidth: number
}

那么接下来的问题是:

是建一个Collection包含全部账单还是三个Collection分别包含一种账单?

如果说建三个Collection,那还不如用MySQL。

正确的做法是建1个Collection同时储存3种账单

那么问题又来了:

如何判断这个JSON对象的类型?

很多人说,加个type就行啦,代码可以这样写

if (invoice.type === 'Electricity') {
   // 处理电费账单
} else if (invoice.type === 'Water') {
   // 处理水费账单 
} else if (invoice.type === 'HomeBroadband') {
   // 处理宽带账单
}

但是这个invoice对象是第三方系统传递过来的,压根就没有type字段

那这样写总行把

if (typeof invoice.kwz !== 'undefined') {
   // 处理电费账单
} else if (typeof invoice.ton !== 'undefined') {
   // 处理水费账单 
} else if (typeof invoice.bandwidth !== 'undefined') { {
   // 处理宽带账单
}

可以的!

第二天老板说:这边还有1000多种类型的订单,全部都给加上

…………

那到底我们又该如何验证这个对象,并且在储存时格式化成符合相关的定义呢?

如果你对这些问题感兴趣,那就一定不要错过林老师的《数据大师》系列文章

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant