Data consistency with Multi-path updates - The Firebase Database For SQL Developers #7

Data consistency with Multi-path updates – The Firebase Database For SQL Developers #7



请大家把我当作Demi Lovato 查询? 这是它的功能吗? 让我们开始吧 嘿 朋友们 欢迎来到在Firebase
数据库的 SQL开发者如何使用Firebase数据库
的第七节课 今天我将 教你们多路径更新 如果你看了以前的课件 你学到了非规范化 非规范化就是 复制数据以减少 或简化
您的查询的另一种说法 当你非规范化你的数据时 你将会有很多小的数据
片段散落四处 然后你只能一个一个的来找 却不能做复杂的查阅 这对读取性能是有好处的 这里有些时候是有复杂性的 当你面对杂乱无章的数据时 当一个数据变动位置 你要怎样怎样确保数据的连贯性? 这就是多路径更新的工作范围了 让我们打开笔记本电脑 多路径更新的目标是 与非规范化一起组合一致性 这就是我们一直在制作的数据库 或者是它的子集
我们拥有的用户 还有事件参与者 所以这些用户就是我们的用户 eventAttendees是用户
将要参与的事件 在这些情况下你可以看到 我们在非规范化用户的信息 所以在用户1下方
那是所有David的信息 我们刚刚复制了信息 在事件参与者fm1下方 这很方便 因为我们不需要接入来
获取用户信息 如果我们上传David
到Dave的使用者里 我们又要怎样上传事件参与者? 你可能想到我知道怎么办了 这很简单 我要在我的数据库里
创建一个根索引 然后在users1创建关于David的地址 然后在eventAttendees/fm/1
创建David的 事件参与者记录的参数 然后到现在 你有两个参数了 然后我们可以把他们上传
命名为David 当这个参数可以为这个简单事件
所用 那如果David 去了其他事件呢? 我们怎样知道所有David
将去的事件? 达成这个我们要创建一个 查看 查看 就是一个数据框架 把相似信息聚拢在一起 我们可以用数据钥匙来寻找事件 在这个情况下 我们要用
用户ID钥匙 来找到用户要参与的事件 我们把这个数据框架
命名为 userEvents 所以userEvents/UID/eventId
会告诉我们 如果哪个用户将要前往那格事件 实践上来说 这就是它
将有的样子 这会是userEvents/1 然后 是所有用户事件的钥匙 我们只是简单地存储
事实在每个事件旁边 因为我们只在说
用户将要去 你可以存储任何 你现在想要的
但是事实仅仅是惯例而已 现在我们有了这个查询平台 上传名字将会变的很简单 所有那些用户将参与的事件 所以我们来在根数据库创建
一个引用 然后我们创建一个引用
在查询平台上 然后我们可以仅仅去在eventAttendees 里面的用户上 创建一个引用 然后我们就可以获取Dave
的所有将参与日程 然后我们将循环通过每一个事件 因为snap.forEach 将会
以快照传回每一个事件 现在我们来创建一个引用 在eventAttendees的记录上 现在eventAttendees的记录 会记录David将要参与这个事件 然后我们想要把这个非规范化
来记录到 配置文件里 所以要这么做我们要命名attendees.child 现在我们需要事件钥匙 与用户将要前往的事件 eventSnap.key将会提供我们钥匙 然后命名 .child of snap. snap.key 仅仅是用户的ID 你可以看到它是因为我们现在
正在编辑Dave的事件引用 我们现在结束slash1 然后钥匙总是在引用里最后的钥匙 现在我们有正确的引用了 我们现在只需要上传
然后以新名字上传 这会在每个用户事件
中重复循环 然后更新以及持久地 保持非规格化数据 但是这里有一个问题 记住这个编码是在客户上写的 我们现在仅仅在处理三个
eventAttendee记录 但是试想我们如果在处理
300 或 3000 个 那将会使这个循环持续几秒钟 来完成循环 这时间对于用户来说很长 来关闭应用或者关闭网站 这回会使你的数据进入
未完成状态 某些记录会是Dave的 某些仍然会是Dave的 这很难返回并且更新因为 你需要手动操作 与其这样 我们可以使用多路径更新 多路径更新可以为你提供核心操作 处理会失败或者会成功 那里没有未完成案例 所以多路径更新的工作方式 是你选择特定路径 然后过去的值的上传 然后在JavaScript 你设置
这个与一个目的 这仅仅是一个字典 然后在Java 这仅仅是一个
哈希映射 你甚至可以看到那三个SKDs 他们看上去基本上是一样的 当你建立更新对象 你需要确认所有的路径
都来自于同一个子集 在这种情况下 这是根数据库 你将会碰到很多这种情况 因为这会使工作变的简单一点 然后从那里开始 你从你的
根引用更新 然后所有的东西会以一个
核作业来完成 所以这是我们该怎样
手动设置 但你可能会想要
创建一个动态化的 然后让我们可以使用查询 所以我们将在JavaScript
创建一个程式 可以给我们的用户信息
更新他们的名字 但是也是为了所有的
eventAttendees的信息 我们返回到查询 然后 我们将创建这个程式 然后它将进入user's ID的根引用 然后还有我们要更新的名字 所以我们要做的第一件事 是我们要创建一个引用 与userEvents lookup联系
然后我们将 读取信息一次因为 这将使我们知道用户的所有
即将参与的项目 从这里 我们可以在JavaScript
里的Object.keys 来获取所有的事件钥匙 接下俩我们要输入一个占位符 为我们的更新任务 现在我们有了eventKeys数列 我们将创建一个forEach然后
逐个通过它 关于每个迭代我们将 建立一个到eventAttendees记录
的路径 所以我们将与eventAttendees
一起开始 在eventKey添加斜线
在user's ID添加斜线 然后在名字后加斜线
因为我们在更新名字 然后我们将它设置成
已更新名字 现在我们要做的做后一件事 是去创建一个接入用户目录
的路径 所以我们学要建立一个
通往users/UID/name 的路径 然后链接它到已更新名字 最后我们将返回rootRef.update 然后自动从根更新 这会返回到一个这个程式的
一个指令 这是一个很好的方式来塑造
一个核运行 所以来使用它我们可以命名
其为updateName 通过根引用 user's ID 然后更新名字 然后通过指令 我们可以命名.then
然后如果这成功了 这将会被命名 然后我们将
知道我们的核运行 成功了 如果失败.catch将会出现 然后我们将会看到错误 这会看似 你将看到用户名录会被更新 也包括所有的eventAttendees 现在多路径更新很好因为 你可以获得连贯性的非规范化 但是那里也有一些小问题需要注意 第一个就是很多第一次使用者 还有有经验的使用者 可以损毁很多现有数据 这是我们之前创建的 多路径更新对象 你可以看到我们正在深入进程 与新的数据 但是与其创建一个像这样的程式 倒不如 用斜杠名称和深路径来替代所有人 你创建一个姓名程式然后保存 到根目录里 所以你可能会想那方程
有着同样的功能 给David更新姓名到David的数据库里 但是那将不会实现 将会实现的是 所有现存数据都会被消除 然后只有Dave的名字会被更新 事件发生的原因是 当你创建一个多路径更新 你需要确认你尽可能地明细了程式 在路径中 一个设置会取代
所有现存的 在此路径中的信息 下一个需要注意的是面对大数据集 这是另一个多路径更新 所以宁可仅更新 所有重复字段的名字 我们还要更新所有这些区域的年龄 你可以看到这开始变为 一个指数运算
每一次运算 每当我们想要更新
一个新的产物 我们得要更新每一个条目 这很小 如果你需要处理几百个案例 这将会变的很大 这也会是对网络的一个挑战 到这里时 你想要将其转成服务器端 你只需要 上传用户的目录到这个案例里 在服务器上你将会被列为子变动事件 关于用户的钥匙
然后每次用户目录 的更新 你都会得到反馈 然后你可以浏览所有用户 对于非规范化路径的变动 多路径更新是你怎样通过 非规范化和核运作来获取连续性 所以当你在复制你的信息到你的数据库时 请确保你的路径的准确性 然后你可以获取连续性和非规范化 这节课就到这里 如果你喜欢这个视屏
请点赞并且订阅 我们下期课程再见 嘿!感谢您花时间观看此视频 你也许会喜欢这个视屏 你因该订阅我们
因为这只是指尖一动而已 哦! 哦! 那是一个不好的决策

30 thoughts on “Data consistency with Multi-path updates – The Firebase Database For SQL Developers #7

  1. The server side example isn't exactly one atomic operation is it? It looks more like the first update, in this example the Name="Dave", is updated and written to the database, THEN a trigger or something listens to that and propagates the change across all other items storing that value in a single atomic operation.

    So really there are two operations happening here. Now lets say the second half fails, and none of the other items are updated resulting in an inconsistent state.

    Is this correct or is that first update to Dave's name and the second piece somehow part of the same atomic operation?

  2. Wouldn't it help if we do the same using Cloud functions rather than doing it from the client side. One API call is all it takes.

  3. So with denormalization, are there any rules whether to duplicate ALL data of an object versus duplicating only those attributes you need in your reads?

  4. after many years of working with databases of all sorts i've concluded that denormalization is mostly trouble and to be used as sparingly as possible. the example, while perhaps just there for the purpose of illustrating multi-path updates, is a poor example because you can expect something like "name" to be changed somewhat frequently – if we're going to denormalize, we'd hope that updates are very infrequent. it would be nice if firebase can add a way to either cascade updates by linking properties in different stores (think foreign key), or introduce the notion of updateable views

  5. I don't know of any system outside of a tutorial one that has just 2 'tables'. Yes, this is the classic 'Students', 'Classes' example – but it is not how real systems work. They have dozens of tables, all linked in one way or another. This approach means that any data I have might be copied 5, 10, 20 times! That an 'update' will not be a matter of 3 lines of SQL, but 50 lines of this mess. And again we never hear what does Firebase offer that is better, why would I want to do this in Firebase?

  6. Is this still the recommended way to go with firestore (instead of RTDB)? Wouldn't we use sub-collections instead of top-level constructs like "eventAttendees"?

  7. I see it perfectly works if you need update nodes simultaneously, but what if an app requires mix of remove/update operations? Would Promise.all([updatePromise, deletePromise]) keep the action atomic?

  8. do we have to manually create the lookup. so for every event a user goes to, you add the event key in the look_up right? is there a way to do this automatically

  9. multipath update could be done by Cloudfunction and avoid clientSide updates? In this way collections updates will be done on server side. isn't it?

  10. So that means if I want to use MPUs and I want to record changes to my form (which has 20 fields) I need to write twenty lines of code, one path for each field? For each location? So two locations would be 40 lines of code? Why doesn't it works like an update rather than a set. Shouldn't it be called multi path set?

  11. This is some 2010 Angular.js stuff. "Now even your great grandma can build amazing example to do lists!", but as a product it will most likely ruin your company unless you get more funding so you can rebuild in React. (Angular 4 is here!)

  12. this is a helpful series, but this guy when tries to be Jim Carrey becomes pretty annoying to me . it could work in one or two videos but in all , I do not find it funny at all, however, helpful series .

  13. I need an answer to this firebase question based on your multipath updates. It is quite disturbing. https://stackoverflow.com/q/44868465/8069271

  14. I realize NoSQL is a different animal than SQL but it looks like Google has created yet another species that requires a lot more code and hacks to get things done. If you compare Firebase querying to say MongoDB which is also NoSQL, Firebase looks terrible. Imagine the code structure you will have once your app is done? It will be a nightmare, forget about age old software engineering concepts because some of them cannot exist in the Firebase world.

    Image this, You have a data access layer in your app and part of it is responsible for managing the Users and another part is responsible for managing Events. Now with all these lookups and work-arounds you will have to lump all that together so that your User repository would have to also manage any other data that references Users. So instead of having separate single responsibility classes for each entity you will need one large pile of code that manages many entities.

    I'm struggling to bring myself to think this is a good idea. The concept of a real time database seems cool but it totally jacks up your architecture in order to use it. So you are trading clean implementations in order to get essentially a two way binding to the database. But this is only the case with Firebase, there are other NoSQL solutions that are not this bad.

  15. i don't know maybe its the subject matter, but i feel like either his tone and cadence of speaking is confusing the shit out of me. like a slightly out of tune instrument or slightly off beat drum in a orchestra.

Leave a Reply

Your email address will not be published. Required fields are marked *