1
00:00:00,060 --> 00:00:02,360
Michael: Hello and welcome to Postgres.FM, a weekly show about
2
00:00:02,360 --> 00:00:03,420
all things PostgreSQL.
3
00:00:03,420 --> 00:00:05,860
I am Michael, founder of pgMustard, and as usual, I'm joined
4
00:00:05,860 --> 00:00:07,680
by Nikolay, founder of Postgres.AI.
5
00:00:07,680 --> 00:00:08,420
Hey, Nikolay.
6
00:00:08,940 --> 00:00:09,740
Nikolay: Hi, Michael.
7
00:00:10,440 --> 00:00:13,940
Michael: And we have a special guest today, Franck Pachot, who
8
00:00:13,940 --> 00:00:18,100
is a developer advocate now at MongoDB, formerly at YugabyteDB,
9
00:00:18,480 --> 00:00:21,980
which is a distributed PostgreSQL database, also an AWS Data
10
00:00:21,980 --> 00:00:24,400
Hero, and Oracle Certified Master.
11
00:00:24,960 --> 00:00:26,540
So, welcome, Franck.
12
00:00:27,100 --> 00:00:27,600
Franck: Hi.
13
00:00:28,260 --> 00:00:28,760
Thanks.
14
00:00:28,940 --> 00:00:30,140
Thanks for having me there.
15
00:00:30,580 --> 00:00:32,560
Nikolay: And former Postgres blogger.
16
00:00:33,520 --> 00:00:34,020
Franck: Yeah.
17
00:00:34,460 --> 00:00:34,960
Nikolay: No?
18
00:00:34,980 --> 00:00:35,740
Or yes?
19
00:00:36,300 --> 00:00:37,120
Franck: Oh, yeah, yeah.
20
00:00:37,120 --> 00:00:40,760
I will continue to blog about all databases, it's just that it
21
00:00:40,760 --> 00:00:42,540
depends on the time I have.
22
00:00:42,700 --> 00:00:43,260
Nikolay: Sounds good.
23
00:00:43,260 --> 00:00:48,400
So I saw you are going to give a talk at some Postgres conference
24
00:00:48,400 --> 00:00:49,440
in India, right?
25
00:00:49,440 --> 00:00:51,400
PGConf India, I don't remember the name.
26
00:00:51,760 --> 00:00:53,660
So still planning to do it, right?
27
00:00:54,340 --> 00:00:54,840
Franck: Yeah.
28
00:00:55,080 --> 00:00:56,460
And also Germany.
29
00:00:56,580 --> 00:00:58,120
I just got the acceptance.
30
00:01:00,900 --> 00:01:01,820
Nikolay: I'm very curious.
31
00:01:02,600 --> 00:01:07,680
During daytime, you work using JSONs and these weird queries,
32
00:01:09,140 --> 00:01:10,620
right, chains of something.
33
00:01:11,420 --> 00:01:15,980
And then at weekend or something you present SQL talks.
34
00:01:16,120 --> 00:01:19,400
How is it going to be played in your mind?
35
00:01:19,400 --> 00:01:20,360
I'm very curious.
36
00:01:22,360 --> 00:01:24,180
Franck: It's all about databases.
37
00:01:24,680 --> 00:01:26,820
I mean, it's all the same.
38
00:01:27,700 --> 00:01:28,600
Nikolay: All the same.
39
00:01:29,640 --> 00:01:33,860
Franck: Yeah, you can do data modeling, document data modeling
40
00:01:33,860 --> 00:01:34,540
on Postgres.
41
00:01:34,560 --> 00:01:35,740
You can do it on Oracle.
42
00:01:35,740 --> 00:01:37,320
You can do it on MongoDB.
43
00:01:37,580 --> 00:01:43,840
You can normalize your data on SQL databases, on NoSQL databases.
44
00:01:44,440 --> 00:01:46,380
The concepts are all the same.
45
00:01:46,380 --> 00:01:51,020
Of course, there are little differences, like how NULLs are undulied,
46
00:01:51,020 --> 00:01:54,920
for example, or how you join or you don't join, but yeah.
47
00:01:54,920 --> 00:01:56,080
Nikolay: NULLs, let's postpone.
48
00:01:56,140 --> 00:01:57,340
It's a special topic.
49
00:01:57,340 --> 00:01:58,820
It's not for the start.
50
00:01:59,480 --> 00:01:59,980
Okay.
51
00:02:00,160 --> 00:02:06,240
I remember a series of blog posts from Michael Stonebraker about
52
00:02:06,600 --> 00:02:11,120
criticizing document databases for lack of normalization and
53
00:02:11,120 --> 00:02:11,820
so on.
54
00:02:12,010 --> 00:02:17,000
So you are saying now that it's totally possible to apply normalization
55
00:02:17,160 --> 00:02:18,560
in document database.
56
00:02:19,340 --> 00:02:20,900
Is this what you're trying to say?
57
00:02:20,900 --> 00:02:22,700
Or maybe I'm getting wrong.
58
00:02:24,840 --> 00:02:30,100
Franck: I've also changed my mind probably because for 2 reasons.
59
00:02:30,100 --> 00:02:32,360
First, the applications have changed.
60
00:02:32,860 --> 00:02:39,040
I think the normalized model was really good for those monolithic
61
00:02:39,220 --> 00:02:44,420
databases where all use cases with the enterprise information
62
00:02:44,600 --> 00:02:48,340
system in 1 database running all use cases.
63
00:02:48,440 --> 00:02:53,940
And then you need a normalized way to structure the data that
64
00:02:53,940 --> 00:02:57,540
is shared by the whole company and all kinds of users.
65
00:02:58,500 --> 00:03:00,120
Today, it's a bit different.
66
00:03:00,340 --> 00:03:02,940
You have multiple services, multiple microservices.
67
00:03:03,220 --> 00:03:05,640
They might have different databases.
68
00:03:06,780 --> 00:03:10,740
And then the concern of normalization may be different.
69
00:03:10,740 --> 00:03:15,540
For example, if you consume data only to read it and not update
70
00:03:15,580 --> 00:03:17,940
it, you can denormalize a bit more.
71
00:03:17,960 --> 00:03:22,500
So that's 1 reason and I think the main reason is also the applications
72
00:03:22,700 --> 00:03:23,740
have changed.
73
00:03:24,360 --> 00:03:30,660
Today in application programming languages you use documents
74
00:03:31,020 --> 00:03:37,400
in nested structure, objects, object graphs, looks like more
75
00:03:37,840 --> 00:03:42,460
like documents so it's easier to move it to applications.
76
00:03:43,620 --> 00:03:47,360
Nikolay: I don't get it because we had documents for forever.
77
00:03:47,620 --> 00:03:53,700
For example, Codd designed relational model originally dealing
78
00:03:53,700 --> 00:03:55,320
with banking systems, right?
79
00:03:56,780 --> 00:04:02,760
In 60s, 70s, and it was not convenient to have nesting at that
80
00:04:02,760 --> 00:04:03,260
point.
81
00:04:03,820 --> 00:04:08,040
Before rational model, we know there were what's the name like
82
00:04:08,240 --> 00:04:13,660
net and I forgot names, but basically closer to...
83
00:04:14,280 --> 00:04:17,000
Franck: Hierarchical models and network models.
84
00:04:17,220 --> 00:04:18,160
Nikolay: Yeah, yeah, yeah, exactly.
85
00:04:18,820 --> 00:04:25,740
And the idea was it's really inconvenient when we keep a document
86
00:04:25,960 --> 00:04:31,160
as a whole and we need to split it into pieces and basically
87
00:04:31,160 --> 00:04:32,360
divide and conquer, right?
88
00:04:32,360 --> 00:04:36,160
We split into pieces and that's how we get flexibility and start
89
00:04:36,160 --> 00:04:36,660
working.
90
00:04:36,900 --> 00:04:40,640
And we had documents at that time as well, like invoices or transactions
91
00:04:42,740 --> 00:04:45,080
like between financial institutions and so on.
92
00:04:45,440 --> 00:04:50,360
So I don't see the big change, just amount of data and so on,
93
00:04:50,360 --> 00:04:50,820
right?
94
00:04:50,820 --> 00:04:55,580
And I don't fully understand why the idea of microservices or
95
00:04:55,580 --> 00:05:00,320
something you, as I understand, you are bringing, like when we
96
00:05:00,320 --> 00:05:02,540
have many, many databases, many services.
97
00:05:02,900 --> 00:05:04,640
Why is it changing this?
98
00:05:04,640 --> 00:05:06,860
Because in my head, it's vice versa.
99
00:05:06,860 --> 00:05:13,440
If we have many services, we do need to structure and split into
100
00:05:14,380 --> 00:05:17,620
more atomic pieces of our data, right?
101
00:05:17,620 --> 00:05:22,320
And the article I mentioned, it's called "Schema Later Considered
102
00:05:22,340 --> 00:05:22,840
Harmful."
103
00:05:24,840 --> 00:05:29,400
After my post, actually, this is why I named my sub-transactions
104
00:05:29,760 --> 00:05:32,380
blog post also considered harmful.
105
00:05:33,080 --> 00:05:38,720
And some folks mentioned on Hacker News mentioned that there
106
00:05:38,720 --> 00:05:42,420
is an article considered harmful, considered harmful, harmful,
107
00:05:43,280 --> 00:05:45,320
considered harmful titles considered harmful.
108
00:05:45,360 --> 00:05:48,940
So it's basically like not a good way to name articles, but the
109
00:05:48,940 --> 00:05:50,280
blog post is quite good.
110
00:05:50,280 --> 00:05:55,840
Like if schema design, normalization still makes sense.
111
00:05:55,840 --> 00:05:59,180
If you don't do it, you deal with bad consequences later.
112
00:05:59,700 --> 00:06:00,860
So please let
113
00:06:00,860 --> 00:06:01,400
Franck: me understand.
114
00:06:01,400 --> 00:06:03,740
Yeah, but it depends on your use case.
115
00:06:04,020 --> 00:06:09,180
And also something I've been working on relational databases
116
00:06:09,300 --> 00:06:14,360
where you normalized, but basically, when I learned databases
117
00:06:14,680 --> 00:06:17,280
at university, it was all about normalization.
118
00:06:17,720 --> 00:06:21,620
And then when you start to work, you hear people talking about
119
00:06:21,620 --> 00:06:23,320
denormalizing everything.
120
00:06:24,120 --> 00:06:29,240
And of course, you just need to think about the access patterns.
121
00:06:29,800 --> 00:06:31,580
Nikolay: Yeah, Let me just add this.
122
00:06:31,640 --> 00:06:34,900
Sorry for interrupting, but let me just add, I totally agree.
123
00:06:34,900 --> 00:06:38,680
If we over-normalize, then we deal with very simple fact that
124
00:06:38,680 --> 00:06:40,980
you cannot create 1 index on 2 tables.
125
00:06:44,500 --> 00:06:47,960
You won't, Because, for example, filtering on 1 table, filtering
126
00:06:47,960 --> 00:06:50,420
on another table, you want a single index scan.
127
00:06:50,640 --> 00:06:54,780
Definitely, this is what we do also.
128
00:06:54,920 --> 00:06:59,160
My team and I, we do, during consulting practice, we say, okay,
129
00:06:59,160 --> 00:07:01,080
here we do need to normalize.
130
00:07:02,320 --> 00:07:07,120
But my point is, if you take Mongo and other document databases,
131
00:07:07,900 --> 00:07:10,740
they just provoke you to avoid normalization at all.
132
00:07:10,920 --> 00:07:13,340
In relational data systems, we can...
133
00:07:13,440 --> 00:07:14,340
Is it OK?
134
00:07:14,340 --> 00:07:15,140
Am I wrong?
135
00:07:16,120 --> 00:07:19,800
Franck: Yeah, for me, you are wrong.
136
00:07:20,860 --> 00:07:26,040
And I think that's also 1 reason MongoDB was interested to have
137
00:07:26,040 --> 00:07:30,980
a developer advocate coming from SQL databases, is that users
138
00:07:31,360 --> 00:07:36,300
tend to think that they have to denormalize everything and to
139
00:07:36,300 --> 00:07:39,260
put everything in 1 document, which is wrong.
140
00:07:40,120 --> 00:07:46,780
The idea in MongoDB is to put together what you insert together
141
00:07:46,800 --> 00:07:53,040
or what you query together, but in different documents if you
142
00:07:53,040 --> 00:07:54,180
query differently.
143
00:07:55,080 --> 00:08:00,300
Just to take an example, another entry system, you don't want
144
00:08:00,300 --> 00:08:03,540
to put together the customers and the orders because you don't
145
00:08:03,540 --> 00:08:09,400
want 1 document per customer where you just add orders that can
146
00:08:09,400 --> 00:08:11,540
be a lot every year.
147
00:08:11,600 --> 00:08:16,500
But the orders themselves, the orders and the other items which
148
00:08:16,500 --> 00:08:21,440
we usually put in 2 tables in SQL databases just because they
149
00:08:21,440 --> 00:08:22,780
have different cardinalities.
150
00:08:23,860 --> 00:08:27,780
That's something you can put in a single document, because you
151
00:08:27,780 --> 00:08:30,520
insert an order with all the items.
152
00:08:30,860 --> 00:08:34,680
You have nobody who will just update
1 item of the order and
153
00:08:34,680 --> 00:08:36,100
you query them together.
154
00:08:36,780 --> 00:08:38,360
Of course, it depends on the system.
155
00:08:38,360 --> 00:08:45,200
If you're in a system that analyzes
the order lines for marketing
156
00:08:45,220 --> 00:08:49,060
purpose, buy the product and you
don't care about the customer
157
00:08:49,060 --> 00:08:51,780
or the other, then maybe the modeling
is different.
158
00:08:51,780 --> 00:08:54,180
And this is where different use
cases are.
159
00:08:54,520 --> 00:08:58,280
But it's not about putting everything
in 1 document.
160
00:08:59,440 --> 00:09:03,940
And that's also why it's good to
do some design reviews?
161
00:09:04,120 --> 00:09:07,440
Because it's easy for a developer
to start and put everything
162
00:09:07,440 --> 00:09:12,260
in 1 document, just moving what
they have in Java to the database,
163
00:09:12,400 --> 00:09:16,280
but still needs design and still
need to think about what you
164
00:09:16,280 --> 00:09:21,440
embed, like denormalize, or what
you reference, like you would
165
00:09:21,440 --> 00:09:24,060
reference with foreign keys in
a secure database?
166
00:09:25,440 --> 00:09:26,400
Nikolay: OK, I hear you.
167
00:09:26,400 --> 00:09:27,940
I think I understand you.
168
00:09:28,620 --> 00:09:33,660
But still, You say users have this
tendency to think.
169
00:09:34,020 --> 00:09:39,900
For example, user Michael Stonebraker
says that he noticed that
170
00:09:40,680 --> 00:09:45,100
maybe it's possible to normalize,
of course, but in relational
171
00:09:45,140 --> 00:09:49,360
databases there is a big tendency
to normalize first and then
172
00:09:49,360 --> 00:09:51,100
denormalize when needed.
173
00:09:52,160 --> 00:09:56,180
In document store databases, there
is the opposite tendency.
174
00:09:56,980 --> 00:10:00,520
Avoid normalization first and then
normalize when we have pain.
175
00:10:01,400 --> 00:10:04,640
The whole article called "Schema
Later Considered Harmful."
176
00:10:04,640 --> 00:10:10,360
I think, as I understand this article,
it's about that the relational
177
00:10:10,520 --> 00:10:15,360
approach, direction of movement
is more beneficial in general
178
00:10:15,360 --> 00:10:17,040
case than opposite.
179
00:10:17,040 --> 00:10:17,980
What do you think?
180
00:10:19,060 --> 00:10:24,960
Franck: Yeah, but remember that
relational databases were made
181
00:10:24,960 --> 00:10:29,340
at a time where we were designing
the data before looking at
182
00:10:29,340 --> 00:10:30,260
the use cases.
183
00:10:31,160 --> 00:10:36,020
The normalization and the data
model doesn't care about the use
184
00:10:36,020 --> 00:10:36,520
cases.
185
00:10:37,340 --> 00:10:39,060
You just model the data.
186
00:10:39,200 --> 00:10:44,440
You have orders, multiple order
items, an order belongs to a
187
00:10:44,440 --> 00:10:44,940
customer.
188
00:10:45,400 --> 00:10:50,320
You do a static model of your data,
and then you bring the application
189
00:10:50,440 --> 00:10:55,760
use cases, and you can optimize
them with indexes, but you don't
190
00:10:55,760 --> 00:10:58,120
change the data model for the use
cases.
191
00:10:58,780 --> 00:11:03,840
But this is not really how applications
are developed today.
192
00:11:04,460 --> 00:11:10,080
Today, applications come with a
main use case and rent fast access
193
00:11:10,080 --> 00:11:11,300
for this use case.
194
00:11:11,820 --> 00:11:15,680
For another use case, they just
check if they can do it on the
195
00:11:15,680 --> 00:11:19,940
same database, or maybe do some
event streaming, put that in
196
00:11:19,940 --> 00:11:21,860
another database and doing elsewhere.
197
00:11:23,000 --> 00:11:24,260
That really has changed.
198
00:11:24,720 --> 00:11:31,040
Today, even applications that run
on SQL databases, I see people
199
00:11:31,640 --> 00:11:35,580
starting a data model, knowing
the access patterns.
200
00:11:38,040 --> 00:11:39,740
And then maybe you can denormalize.
201
00:11:40,120 --> 00:11:43,740
For example, it's okay to denormalize
something that is not updated.
202
00:11:45,060 --> 00:11:49,200
The big danger to denormalize something
that may be updated is
203
00:11:49,200 --> 00:11:53,940
that you have to update in multiple
places, which is a risk of
204
00:11:53,940 --> 00:11:57,900
inconsistency if you forget 1,
and which is also a performance
205
00:11:58,040 --> 00:12:01,080
issue, especially when you distribute,
then you have distributed
206
00:12:01,160 --> 00:12:03,020
transactions at multiple places.
207
00:12:03,620 --> 00:12:09,020
But data that you do not update,
and there is a lot of data that
208
00:12:09,020 --> 00:12:11,760
we don't update, we just add a
new version of it.
209
00:12:11,760 --> 00:12:17,420
For example, a customer is creating
a new order, you will not
210
00:12:17,420 --> 00:12:18,500
update the order.
211
00:12:18,820 --> 00:12:24,380
If we add a new item, that will
be a new order, but the existing
212
00:12:24,380 --> 00:12:26,020
order has been validated.
213
00:12:26,180 --> 00:12:28,780
You don't update this data later.
214
00:12:29,240 --> 00:12:32,860
Usually you have a timestamp, And
even if you change something,
215
00:12:32,860 --> 00:12:34,540
then you just add the new version.
216
00:12:34,540 --> 00:12:36,940
So the applications have changed.
217
00:12:36,940 --> 00:12:39,740
And I'm not saying that 1 is better
than the other.
218
00:12:39,740 --> 00:12:44,980
But when we listen to the developers,
we see that they don't
219
00:12:44,980 --> 00:12:49,020
want to build this ERD diagram.
220
00:12:50,220 --> 00:12:51,340
That was never true.
221
00:12:51,340 --> 00:12:52,580
So that's also something.
222
00:12:53,040 --> 00:12:56,060
Nikolay: Nobody does that anymore,
building ERD diagrams.
223
00:12:56,400 --> 00:13:01,480
Or only our AI system does, but
it's just a side function for
224
00:13:01,480 --> 00:13:01,980
it.
225
00:13:02,140 --> 00:13:06,220
But I don't understand why we cannot
do it on relational databases
226
00:13:06,340 --> 00:13:08,080
and still have all the good stuff.
227
00:13:08,080 --> 00:13:13,400
Because we have JSON, let's just
put it there and so on.
228
00:13:14,680 --> 00:13:18,240
Franck: And It's very good to mix
both.
229
00:13:18,240 --> 00:13:22,620
I've seen a lot of applications
on Oracle, on Postgres, on Yugabyte,
230
00:13:23,680 --> 00:13:29,040
where it's a mix where you have
tables with Columns because they
231
00:13:29,040 --> 00:13:33,420
are updated because you went indexes
on it, and you have a bunch
232
00:13:33,420 --> 00:13:37,040
of metadata information that you
put in a JSON.
233
00:13:37,540 --> 00:13:39,560
And that's also perfectly valid.
234
00:13:40,120 --> 00:13:45,220
Nikolay: And so what does Mongo
bring here, if we have it already?
235
00:13:46,080 --> 00:13:48,900
Franck: I think the API is very
different.
236
00:13:49,440 --> 00:13:50,140
Nikolay: Of course.
237
00:13:50,500 --> 00:13:51,000
Franck: Yeah.
238
00:13:51,260 --> 00:13:53,260
With MongoDB, you can really...
239
00:13:54,560 --> 00:13:56,880
You have your object graph in the
application.
240
00:13:57,340 --> 00:14:01,100
In JavaScript, it's even easier,
but in Java, in whatever, in
241
00:14:01,100 --> 00:14:05,460
Python, and you just communicate
with the Database those documents
242
00:14:05,600 --> 00:14:07,880
and they are stored as documents.
243
00:14:09,180 --> 00:14:13,020
The big problem with SQL databases
or so something that has changed
244
00:14:13,420 --> 00:14:17,960
when Application have changed at
the time where everything was
245
00:14:17,960 --> 00:14:23,860
done in the Database, stored
procedures or pre-compiled procedures
246
00:14:24,060 --> 00:14:26,500
or whatever, then that was okay.
247
00:14:26,820 --> 00:14:32,300
But with object-oriented programming,
you had this mismatch and
248
00:14:32,300 --> 00:14:36,940
you need an object-relational mapping
to map from 1 to the other
249
00:14:36,940 --> 00:14:44,240
if you don't want to do a bunch
of queries in text strings and
250
00:14:44,240 --> 00:14:45,220
through JDBC.
251
00:14:46,160 --> 00:14:54,140
So, what MongoDB brings at that
point is an API that really fits
252
00:14:54,520 --> 00:14:58,340
with the programming language and
then it stores it as documents
253
00:14:58,940 --> 00:15:02,260
rather than mapping that to relational
tables.
254
00:15:02,860 --> 00:15:06,740
Nikolay: Yes, this is what HDB
and HQL are trying to solve.
255
00:15:06,740 --> 00:15:12,600
They try to reinvent SQL to have
this, what you describe.
256
00:15:13,180 --> 00:15:18,720
Yeah, but you mentioned OOP and
ER.
257
00:15:19,020 --> 00:15:22,320
I think this is in the past already,
both.
258
00:15:22,440 --> 00:15:24,660
No, I'm joking, I'm joking.
259
00:15:25,600 --> 00:15:26,140
So for me
260
00:15:26,140 --> 00:15:26,600
Franck: it's like...
261
00:15:26,600 --> 00:15:29,240
Then what do you use today if you...
262
00:15:30,060 --> 00:15:32,820
I mean, applications are built
with objects?
263
00:15:33,700 --> 00:15:38,520
Nikolay: Well, I personally am
a big fan of things what guys
264
00:15:38,520 --> 00:15:45,560
like Hasura, Supabase, others
do with thin layer providing APIs
265
00:15:46,080 --> 00:15:50,040
right away without the need to
write this middleware.
266
00:15:51,600 --> 00:15:55,520
It's great, this serves better
than object-relational mapping.
267
00:15:55,520 --> 00:15:58,440
But people do object-relational
mapping, but at the same time,
268
00:15:58,440 --> 00:16:03,840
I doubt a lot of guys who create
projects, they do actual OOP
269
00:16:03,840 --> 00:16:05,440
with patterns and so on.
270
00:16:05,560 --> 00:16:08,800
It's kind of like somehow not cool
anymore.
271
00:16:08,940 --> 00:16:09,840
It's my perception.
272
00:16:11,240 --> 00:16:14,200
I'm far from actual application
programming lately.
273
00:16:14,200 --> 00:16:18,000
Franck: But it's also this old
debate where do you put your business
274
00:16:18,060 --> 00:16:18,560
logic?
275
00:16:19,540 --> 00:16:23,680
Ideally in a SQL database, you
put it in the database because
276
00:16:23,680 --> 00:16:27,320
data is processed there, but then
you are constrained to specific
277
00:16:27,440 --> 00:16:27,940
languages.
278
00:16:29,100 --> 00:16:30,160
Nikolay: Well, right.
279
00:16:30,480 --> 00:16:37,360
But if you put it to application,
you also have dependency on
280
00:16:37,360 --> 00:16:38,900
this language you chose.
281
00:16:38,900 --> 00:16:39,820
It's the same.
282
00:16:41,180 --> 00:16:47,920
To me, the question about where
to put logic became much easier
283
00:16:47,920 --> 00:16:52,900
to understand since like 10 years
ago when Angular and React,
284
00:16:52,900 --> 00:16:57,980
they obtained, gained popularity
and a lot of logic and actually
285
00:16:57,980 --> 00:17:01,080
Web 2.0, how many years ago already?
286
00:17:01,080 --> 00:17:02,780
Like 20 years ago, right?
287
00:17:02,920 --> 00:17:06,840
All these shifted a lot of client-oriented
logic to clients,
288
00:17:07,060 --> 00:17:08,500
to front-end, right?
289
00:17:08,760 --> 00:17:13,700
And this gave space to have logic
closer to data, like constraints
290
00:17:14,060 --> 00:17:18,680
and what we usually do with triggers,
some dependencies, propagation
291
00:17:18,820 --> 00:17:20,040
of changes or something.
292
00:17:20,860 --> 00:17:23,360
It gives opportunity to keep it
in database where it should be
293
00:17:23,360 --> 00:17:27,260
because otherwise, if you don't
do it closer to database, at
294
00:17:27,260 --> 00:17:31,420
some point when company grows,
project grows, you add some other
295
00:17:32,120 --> 00:17:37,800
tools or application layers or
something called, and you need
296
00:17:37,800 --> 00:17:40,780
to re-implement the same logic
in different places.
297
00:17:41,140 --> 00:17:43,860
And there is no strong guarantee
that it will be well maintained.
298
00:17:43,860 --> 00:17:44,620
Yeah, but the
299
00:17:44,620 --> 00:17:49,080
Franck: problem is just, I totally
agree, and there are very
300
00:17:49,080 --> 00:17:52,860
successful database-centric applications.
301
00:17:54,060 --> 00:17:59,560
But what developers want, they
want to use Java, not PL/pgSQL
302
00:18:00,060 --> 00:18:01,100
and not PL/SQL.
303
00:18:02,280 --> 00:18:08,460
And just because try to hire a
SQL developer or a PL/pgSQL developer,
304
00:18:08,680 --> 00:18:12,600
that will be more difficult than
hiring a team of Java developers.
305
00:18:13,620 --> 00:18:14,120
Nikolay: Right.
306
00:18:14,440 --> 00:18:14,940
Right.
307
00:18:15,300 --> 00:18:16,900
Michael wanted to ask something.
308
00:18:17,720 --> 00:18:20,280
Michael: I don't know if this is
a change of topic, but I think
309
00:18:20,280 --> 00:18:23,600
it's on the same path, which is
around developer experience.
310
00:18:23,600 --> 00:18:27,800
And I know it's a subjective term,
but I do think when, at least
311
00:18:27,800 --> 00:18:30,320
when Mongo went into the market,
but I think NoSQL databases
312
00:18:30,320 --> 00:18:32,480
in general, they promised a few
things.
313
00:18:32,480 --> 00:18:35,660
1 was a really good getting started
experience, a very quick,
314
00:18:35,760 --> 00:18:40,120
easy, you don't have to think much
type, no schema to worry about,
315
00:18:40,380 --> 00:18:41,540
and just get started.
316
00:18:41,660 --> 00:18:44,840
And that's good for some things
and not so good in other ways.
317
00:18:45,040 --> 00:18:46,880
But it also promised a couple of
other things.
318
00:18:46,880 --> 00:18:50,860
And I think we can learn a lot
from these things in terms of
319
00:18:50,860 --> 00:18:51,980
why was it popular?
320
00:18:52,060 --> 00:18:54,240
Like, why did Mongo take off?
321
00:18:54,240 --> 00:18:56,740
Why was NoSQL so popular for so
long?
322
00:18:56,980 --> 00:19:01,580
It also promised kind of infinite,
or at least horizontal scalability.
323
00:19:01,960 --> 00:19:04,200
And that's something we've historically
struggled with.
324
00:19:04,200 --> 00:19:07,600
I know you worked on distributed
SQL, but it's something we've
325
00:19:07,600 --> 00:19:10,500
historically struggled with in
the SQL world.
326
00:19:10,680 --> 00:19:14,700
And then, yeah, I think that combination
of things seemed really
327
00:19:14,700 --> 00:19:15,480
interesting to me.
328
00:19:15,480 --> 00:19:20,020
And I wondered if you had opinions
on what is it about that developer
329
00:19:20,020 --> 00:19:22,280
experience that really resonated
with people?
330
00:19:23,440 --> 00:19:27,080
Franck: For me, that's really developer
experience where MongoDB
331
00:19:28,080 --> 00:19:30,560
is really, was really successful.
332
00:19:31,580 --> 00:19:35,720
The scalability, I don't really
know because I didn't use MongoDB
333
00:19:35,820 --> 00:19:40,700
at that time, and then I've seen
scalability in SQL databases.
334
00:19:41,120 --> 00:19:45,140
The scalability comes from the
data model where you can have
335
00:19:45,140 --> 00:19:46,660
an easy sharding key.
336
00:19:46,700 --> 00:19:47,200
Yeah.
337
00:19:47,300 --> 00:19:51,140
As soon as you have an easy sharding
key, you can distribute
338
00:19:51,200 --> 00:19:54,660
that on mostly all databases today.
339
00:19:54,960 --> 00:19:59,440
On Postgres, you have multiple
options like Citus, like Aurora,
340
00:19:59,760 --> 00:20:02,700
Limitless, where If you have a
sharding key, you can distribute.
341
00:20:03,080 --> 00:20:05,080
I don't think it's really the point
today.
342
00:20:05,080 --> 00:20:07,300
The point is really develop your
experience.
343
00:20:07,300 --> 00:20:13,620
As you say, it's easy to start
and it's easy to integrate to
344
00:20:13,620 --> 00:20:15,320
your programming language also.
345
00:20:15,320 --> 00:20:20,860
Not having something else to learn,
a different language, but
346
00:20:20,860 --> 00:20:25,160
also a different behavior, thinking
about what you need to look,
347
00:20:25,160 --> 00:20:30,380
thinking about foreign keys, thinking
about performance when
348
00:20:30,380 --> 00:20:32,860
you read from multiple tables.
349
00:20:33,400 --> 00:20:37,800
But it's also, the easy to start
is also a problem.
350
00:20:37,800 --> 00:20:42,860
And basically I'm working in the
DevRel team where most of the
351
00:20:42,860 --> 00:20:49,640
job is helping users, developers
to do some proper data modeling
352
00:20:49,640 --> 00:20:50,140
design.
353
00:20:50,940 --> 00:20:53,860
Because it's easy to start, which
is good when you start a proof
354
00:20:53,860 --> 00:20:58,080
of concept, but at some point like
in any database, you need
355
00:20:58,080 --> 00:20:59,120
to do some design.
356
00:20:59,440 --> 00:21:03,840
And the more easy it is to start,
the more difficult it is to
357
00:21:03,840 --> 00:21:07,120
realize that, okay, we are not
in a proof of concept anymore,
358
00:21:07,120 --> 00:21:08,500
we'll put that in production.
359
00:21:08,740 --> 00:21:12,020
It's an application that will evolve
in the coming years.
360
00:21:12,040 --> 00:21:14,160
And then we need to look at the
design.
361
00:21:14,160 --> 00:21:20,140
And this is one of the major activity
in the DevRel team.
362
00:21:20,420 --> 00:21:24,440
It's not like being developer advocate
for Yugabyte was really
363
00:21:24,440 --> 00:21:27,740
about awareness because it's a
new database, so you just need
364
00:21:28,140 --> 00:21:29,540
to let people know it.
365
00:21:29,540 --> 00:21:31,620
MongoDB, people know it.
366
00:21:31,640 --> 00:21:36,760
You just need to make them successful
with maybe a bit more complex
367
00:21:36,780 --> 00:21:39,940
use cases and do some data modeling.
368
00:21:41,500 --> 00:21:46,320
Nikolay: So I have a question about
how your personal experience
369
00:21:46,640 --> 00:21:49,300
and this decision you made, obviously,
recently.
370
00:21:50,500 --> 00:21:54,660
It feels like you switched teams,
like in soccer or football.
371
00:21:55,960 --> 00:21:56,460
Right?
372
00:21:56,980 --> 00:22:03,700
So my question was, any, like,
transfer cost?
373
00:22:04,660 --> 00:22:07,440
Franck: Ah, that's a very good
question.
374
00:22:07,580 --> 00:22:09,740
So let me explain how it was.
375
00:22:10,200 --> 00:22:15,280
I was really happy at Yugabyte, about
the team, about the colleagues,
376
00:22:15,280 --> 00:22:16,240
about the product.
377
00:22:16,440 --> 00:22:19,180
I was really not looking for another
job.
378
00:22:19,300 --> 00:22:22,860
And when other companies contacted
me, I was like, oh, sorry,
379
00:22:22,960 --> 00:22:24,520
I'm happy where I am.
380
00:22:24,640 --> 00:22:29,180
And when MongoDB contacted me,
it was more by curiosity, like
381
00:22:29,240 --> 00:22:33,980
why an SQL databases is interested
by my experience.
382
00:22:34,940 --> 00:22:38,600
And this is why I started discussions
by curiosity.
383
00:22:39,340 --> 00:22:43,920
And then this is where I realized
that it was really an interesting
384
00:22:43,940 --> 00:22:48,800
approach that's helping users on
document databases with the
385
00:22:48,800 --> 00:22:53,040
knowledge of SQL databases, being
able to discuss with those
386
00:22:53,040 --> 00:22:56,940
who use Postgres, who use MongoDB,
who have a new use case, they
387
00:22:56,940 --> 00:23:00,440
want to know if they can do it
on both or one is better than the
388
00:23:00,440 --> 00:23:00,940
other.
389
00:23:01,380 --> 00:23:02,380
That was interesting.
390
00:23:03,420 --> 00:23:07,040
And I was like, OK, I should think
about that.
391
00:23:07,640 --> 00:23:11,440
And then, of course, there is an
offer that was interesting enough
392
00:23:11,440 --> 00:23:14,340
to say, OK, why waiting, just going
there?
393
00:23:14,340 --> 00:23:18,300
But I could have the same offer
from Yugabyte.
394
00:23:19,020 --> 00:23:22,700
So it's not really what makes the
decision.
395
00:23:23,400 --> 00:23:28,300
Maybe it just push you to say,
why not now rather than waiting
396
00:23:28,580 --> 00:23:30,040
6 months or 1 year?
397
00:23:30,300 --> 00:23:33,700
But no, the point was really learning
something new.
398
00:23:33,700 --> 00:23:35,960
I really like learning something
new.
399
00:23:36,040 --> 00:23:40,340
And all the content I create is
me about learning.
400
00:23:41,820 --> 00:23:42,940
Nikolay: Yeah, well, yeah.
401
00:23:43,100 --> 00:23:46,080
My first reaction was, of course,
I became very upset.
402
00:23:46,760 --> 00:23:52,860
And I started to think, is it like
sudden change of your views
403
00:23:54,120 --> 00:24:00,460
or maybe you slowly became more
unsatisfied with state of relational
404
00:24:00,460 --> 00:24:02,300
and SQL world and so on.
405
00:24:02,300 --> 00:24:07,160
So I asked our AI assistant, and
as you know, we have all your
406
00:24:07,160 --> 00:24:08,000
blog posts.
407
00:24:08,420 --> 00:24:12,800
So I asked to research among blog
posts where you talked about
408
00:24:12,800 --> 00:24:18,960
NoSQL and SQL, and to my surprise,
it said you had such posts
409
00:24:18,960 --> 00:24:22,000
in the past and it's not a sudden
change of views.
410
00:24:22,080 --> 00:24:25,620
So the result from AI was it's
not a sudden change of views.
411
00:24:25,680 --> 00:24:31,580
But when I start, I asked to dig
deeper, It was obvious that
412
00:24:31,980 --> 00:24:37,160
maybe the key reason was nulls
in your past blog posts.
413
00:24:38,500 --> 00:24:41,980
The key criticism point was how
null behavior.
414
00:24:42,440 --> 00:24:44,340
And I was going to raise this.
415
00:24:44,340 --> 00:24:47,400
I did it during the weekend and
I was going to discuss this but
416
00:24:47,400 --> 00:24:51,420
as I already tweeted or x'd I don't
know how to say it.
417
00:24:51,420 --> 00:24:55,120
Yesterday, what happened yesterday
in the morning, my team made
418
00:24:55,120 --> 00:24:59,480
mistake and I actually I looked
at that merge request myself
419
00:25:00,140 --> 00:25:05,100
so it was not null safe operation
leading to nasty bug, which
420
00:25:05,220 --> 00:25:09,340
led to multiple companies receiving
emails from us, actually
421
00:25:09,340 --> 00:25:12,020
a few emails from us, with wrong
data.
422
00:25:12,360 --> 00:25:17,100
And it was because of just comparison,
not involving three-value
423
00:25:17,160 --> 00:25:17,660
logic.
424
00:25:18,400 --> 00:25:21,540
And I was beaten by this so many
times.
425
00:25:21,540 --> 00:25:26,660
I had a startup where I was stuck,
my own startup, I was stuck
426
00:25:26,660 --> 00:25:29,160
7 months without growth.
427
00:25:29,700 --> 00:25:34,320
Although I knew there should be
growth, but there is no growth
428
00:25:34,600 --> 00:25:39,880
and then I almost gave up and then
I digged deeper into the code
429
00:25:39,880 --> 00:25:44,220
and found this bug again not null
safe comparison we fixed it
430
00:25:44,220 --> 00:25:48,500
and in a few weeks we had 80,000
registrations per day.
431
00:25:49,600 --> 00:25:51,640
I almost gave up on that startup.
432
00:25:51,880 --> 00:25:57,180
This was like all nothing kind
of, you know, it's just, it's
433
00:25:57,180 --> 00:26:01,740
distinct from or distinct like
or coalesce, you can fix it in
434
00:26:01,920 --> 00:26:02,780
multiple ways.
435
00:26:02,860 --> 00:26:07,200
But if you overlook it's just a
single line of problem that which
436
00:26:07,200 --> 00:26:09,500
can cost you a lot of money and
time.
437
00:26:09,960 --> 00:26:14,020
And like maybe whole startup can
depend on it as in my story.
438
00:26:14,020 --> 00:26:18,980
So I'm definitely with you in the
criticism of null and not in
439
00:26:19,240 --> 00:26:20,780
with null values, right?
440
00:26:21,820 --> 00:26:26,820
Franck: I'm not really criticizing
it because I love the free
441
00:26:26,820 --> 00:26:27,760
value logic.
442
00:26:28,140 --> 00:26:32,380
I love nulls because I think I
understand it.
443
00:26:32,980 --> 00:26:34,300
Nikolay: I also think I understand.
444
00:26:34,300 --> 00:26:35,580
I also love exactly.
445
00:26:36,220 --> 00:26:36,980
Yeah, yeah, yeah.
446
00:26:37,860 --> 00:26:40,680
Franck: But it took me 20 years
to understand it.
447
00:26:40,680 --> 00:26:44,180
And then I can understand that
a developer who already has a
448
00:26:44,180 --> 00:26:49,300
lot of things to learn, do not
want to spend time on something
449
00:26:49,300 --> 00:26:50,880
that looks like mathematics.
450
00:26:53,040 --> 00:26:53,820
Nikolay: It's good.
451
00:26:54,020 --> 00:26:57,240
It's kind of like I kind of came
from academia, right?
452
00:26:57,500 --> 00:27:01,780
And I learned quickly during my
university time because I had
453
00:27:01,780 --> 00:27:06,580
a very good professor, a big specialist
in databases, and I quickly
454
00:27:06,580 --> 00:27:07,340
learned it.
455
00:27:07,540 --> 00:27:11,600
But it took me 20 years to stop
liking it because I see reality
456
00:27:11,740 --> 00:27:15,760
says nobody, nobody, like everyone
steps on this rake all the
457
00:27:15,760 --> 00:27:16,980
time, including myself.
458
00:27:17,920 --> 00:27:19,460
Franck: Yeah, you need to be pragmatic.
459
00:27:19,780 --> 00:27:25,080
But also, you can also solve all
problems in SQL databases.
460
00:27:25,580 --> 00:27:27,020
Just don't use NULL.
461
00:27:27,400 --> 00:27:29,780
Just set all columns, not null.
462
00:27:30,040 --> 00:27:30,860
And that works.
463
00:27:30,920 --> 00:27:32,580
And you were talking about normalization.
464
00:27:33,900 --> 00:27:36,000
Just normalize a bit more.
465
00:27:36,260 --> 00:27:41,420
If you are tempted to put a NULL
in a column, then it's probably
466
00:27:41,520 --> 00:27:44,700
because this column belongs to another
table.
467
00:27:45,040 --> 00:27:48,200
And then it will not be a NULL,
it will be the absence of a row
468
00:27:48,200 --> 00:27:49,340
in another table.
469
00:27:51,200 --> 00:27:58,040
Just go forward, full normalization,
and do not allow any NULL,
470
00:27:58,260 --> 00:27:59,620
and that will work.
471
00:27:59,760 --> 00:28:00,400
I mean,
472
00:28:00,860 --> 00:28:01,840
Nikolay: It will work, but
473
00:28:01,840 --> 00:28:03,160
Franck: you will not have those
errors.
474
00:28:03,160 --> 00:28:05,320
Maybe you will have some performance
issues.
475
00:28:05,420 --> 00:28:05,920
Nikolay: Exactly.
476
00:28:06,820 --> 00:28:08,700
Performance issues will be inevitable.
477
00:28:10,260 --> 00:28:13,340
Franck: I see NULL like denormalization.
478
00:28:14,060 --> 00:28:16,040
It's a shortcut that is easy.
479
00:28:16,040 --> 00:28:21,900
It's so easy just to say, okay,
let's put a NULL because it doesn't
480
00:28:21,900 --> 00:28:22,740
have a value.
481
00:28:23,400 --> 00:28:26,980
If it doesn't have a value, it
should not have a row in the table.
482
00:28:28,260 --> 00:28:28,760
Nikolay: Yeah.
483
00:28:29,040 --> 00:28:36,620
I also remember, like, imagine
you have CTO or some leader who
484
00:28:36,620 --> 00:28:37,660
understands NULLs.
485
00:28:38,380 --> 00:28:42,180
Imagine all those poor application
developers who write Java,
486
00:28:42,180 --> 00:28:50,040
JavaScript, doesn't matter, PHP
code, Ruby code, and this CTO
487
00:28:50,160 --> 00:28:55,520
with this understanding of NULLs
in SQL constantly putting pressure
488
00:28:55,580 --> 00:28:59,320
like you again you used it wrong
in your code and I was this
489
00:28:59,320 --> 00:29:03,620
person and right now I'm like I
think just NULLs is
490
00:29:03,620 --> 00:29:03,920
Franck: a good
491
00:29:03,920 --> 00:29:09,320
Nikolay: concept but the world
says please no it just doesn't
492
00:29:09,320 --> 00:29:12,520
work well So that's why I say I
don't like them.
493
00:29:12,520 --> 00:29:14,120
Franck: I will take another analogy.
494
00:29:14,440 --> 00:29:17,060
I think the best editor is VI.
495
00:29:18,040 --> 00:29:18,940
Because I also
496
00:29:18,940 --> 00:29:19,340
Nikolay: agree to
497
00:29:19,340 --> 00:29:20,240
Franck: learn it.
498
00:29:20,380 --> 00:29:22,440
Yeah, we had to learn it
499
00:29:22,440 --> 00:29:23,500
Nikolay: inside TMAX.
500
00:29:23,560 --> 00:29:25,840
Franck: It was hard to learn it,
we had to learn it.
501
00:29:25,840 --> 00:29:28,800
But when you know it, you are very
efficient with it.
502
00:29:28,980 --> 00:29:33,580
But I can understand that a junior
today do not want to learn
503
00:29:33,640 --> 00:29:34,940
all those VI commands.
504
00:29:36,040 --> 00:29:37,060
Same for null.
505
00:29:37,240 --> 00:29:42,140
I mean, if you learn it and if
you spend all your life doing
506
00:29:42,160 --> 00:29:44,640
SQL, then, yeah, it's good.
507
00:29:45,060 --> 00:29:46,960
But that's not the reality.
508
00:29:47,660 --> 00:29:52,440
Nikolay: Yeah, so back to Monga,
and let's talk a little bit
509
00:29:52,440 --> 00:29:58,380
about the alternative and if we
go out of SQL world, but stay
510
00:29:58,380 --> 00:30:03,060
inside databases, what's happening
to nulls and empty values,
511
00:30:03,080 --> 00:30:04,900
unknown values and so on.
512
00:30:05,540 --> 00:30:08,080
Zeros, empty strings.
513
00:30:08,860 --> 00:30:11,620
Should it be considered all the
same or no?
514
00:30:15,020 --> 00:30:17,540
Franck: In SQL, for me in SQL it's
easy.
515
00:30:17,560 --> 00:30:21,440
A null is a value that exists,
but you just don't know the value.
516
00:30:24,220 --> 00:30:28,280
Your top manager has a salary,
but you don't know it.
517
00:30:28,840 --> 00:30:33,280
So if you have to put all salaries
in a database, then you will
518
00:30:33,280 --> 00:30:33,960
have a null.
519
00:30:33,960 --> 00:30:37,120
And maybe you will put it 1 day,
just because you don't know
520
00:30:37,120 --> 00:30:39,360
it yet at the time where you insert.
521
00:30:40,080 --> 00:30:44,980
The problem is that null is used
for other things, for something
522
00:30:45,060 --> 00:30:46,220
that doesn't exist.
523
00:30:46,220 --> 00:30:49,540
You know, when in Excel we say
NA, doesn't apply.
524
00:30:50,580 --> 00:30:56,200
And if you use this as doesn't
apply in JVa script, you're just
525
00:30:56,200 --> 00:30:59,860
trying to store it and have the
same logic when you query the
526
00:30:59,860 --> 00:31:00,360
database.
527
00:31:00,860 --> 00:31:02,540
So MongoDB does that.
528
00:31:02,780 --> 00:31:05,040
It's very similar to not exist.
529
00:31:05,080 --> 00:31:08,880
You have those documents where
you can declare an attribute or
530
00:31:08,880 --> 00:31:09,380
not.
531
00:31:09,960 --> 00:31:14,440
And in most cases, if it's not
there, it's similar to null.
532
00:31:15,240 --> 00:31:19,300
And if you want to say explicitly
it exists but I don't know
533
00:31:19,300 --> 00:31:24,740
the value, then add something else,
like a boolean that says,
534
00:31:24,740 --> 00:31:26,540
okay, we don't know it.
535
00:31:28,700 --> 00:31:29,200
Nikolay: Yeah.
536
00:31:29,280 --> 00:31:32,120
By the way, You mentioned you like
it, it's a good concept, but
537
00:31:32,120 --> 00:31:37,120
I'm thinking, so many caveats,
for example, if you take null
538
00:31:37,120 --> 00:31:40,940
value and do plus 1, it will be
also null, like unknown, remains
539
00:31:40,940 --> 00:31:44,020
unknown, because we don't know
what we're using.
540
00:31:44,340 --> 00:31:44,700
If you
541
00:31:44,700 --> 00:31:48,000
Franck: don't know a value, then
you can add 1 and you still
542
00:31:48,000 --> 00:31:49,100
don't know the value.
543
00:31:49,540 --> 00:31:52,800
Nikolay: If you say at the same
time if you use aggregate sum
544
00:31:53,360 --> 00:31:56,620
it's not like that it uses 0 instead
of now right?
545
00:31:58,580 --> 00:32:01,880
Franck: Yeah because you sum the
use it's defined as summing
546
00:32:01,880 --> 00:32:03,820
the known values.
547
00:32:03,820 --> 00:32:05,880
Nikolay: You cannot explain this,
it's not logical.
548
00:32:05,900 --> 00:32:13,160
It's just as is, because sum is
just plus 1 argument, plus different,
549
00:32:13,480 --> 00:32:17,440
just a sequence of plus operations,
right?
550
00:32:18,620 --> 00:32:18,900
Franck: But...
551
00:32:18,900 --> 00:32:21,400
Depends on how you define the aggregation.
552
00:32:22,300 --> 00:32:24,940
If it's even the sum of the known
value...
553
00:32:26,680 --> 00:32:32,760
Nikolay: If we have 3 rows, salary,
like $1, $2, and NULL dollars,
554
00:32:32,780 --> 00:32:33,680
NULL, right?
555
00:32:33,680 --> 00:32:34,180
Yeah.
556
00:32:34,200 --> 00:32:40,380
If we just perform explicit summarization,
the result will be
557
00:32:40,380 --> 00:32:40,880
NULL.
558
00:32:40,960 --> 00:32:43,660
But if we use sum, we should be
the same result.
559
00:32:43,660 --> 00:32:44,760
It will be not the same.
560
00:32:44,760 --> 00:32:45,740
It will be 3.
561
00:32:47,500 --> 00:32:50,460
Franck: Depends on how you define
it, but SQL defines that as
562
00:32:50,460 --> 00:32:53,040
the sum of the values that you
know.
563
00:32:54,840 --> 00:32:55,400
Nikolay: I apologize.
564
00:32:55,400 --> 00:32:55,840
It gives
565
00:32:55,840 --> 00:32:58,520
Franck: you an idea, and it makes
sense.
566
00:32:58,520 --> 00:33:03,660
I mean, if you have 1000000 rows
and you ask for a sum, you probably
567
00:33:03,720 --> 00:33:07,540
don't run an unknown just because
1 is not known.
568
00:33:07,540 --> 00:33:11,500
At least you know the sum of the
existing ones.
569
00:33:12,100 --> 00:33:14,440
Nikolay: Let me apologize and explain
what's happening here.
570
00:33:14,440 --> 00:33:19,660
I just flipped the board and made
you defend the SQL world, which
571
00:33:19,660 --> 00:33:23,300
is interesting because it shows
that you have courage to become
572
00:33:23,300 --> 00:33:24,520
specialist in both worlds.
573
00:33:24,520 --> 00:33:25,380
This is interesting.
574
00:33:27,440 --> 00:33:33,220
Franck: For me, I changed the company
and I help different users,
575
00:33:33,380 --> 00:33:37,460
but I did not change what I think
about databases.
576
00:33:37,720 --> 00:33:40,840
I mean, I've been working a lot
with Oracle, I still think it's
577
00:33:40,840 --> 00:33:43,860
a very good database, but I can
understand that people want to
578
00:33:43,860 --> 00:33:47,380
move out of it, and it's probably
not because of the features.
579
00:33:47,720 --> 00:33:51,380
I like Postgres, but I also think
that there is something else
580
00:33:51,380 --> 00:33:54,560
to do in the storage and to distribute
it.
581
00:33:54,640 --> 00:33:59,020
I like YugabyteDB, but I also understand
that some people may
582
00:33:59,020 --> 00:34:00,960
want to use something else.
583
00:34:01,360 --> 00:34:02,380
Same for MongoDB.
584
00:34:04,020 --> 00:34:08,160
I just want to help users when
I can help them.
585
00:34:08,560 --> 00:34:13,980
And also something, especially
on Twitter, but we see a lot of
586
00:34:13,980 --> 00:34:18,200
people comparing databases like
MySQL is better than Postgres
587
00:34:18,220 --> 00:34:21,220
or Postgres is better than MySQL
or whatever.
588
00:34:21,820 --> 00:34:25,360
And what I always say is that the
best database is the 1 that
589
00:34:25,360 --> 00:34:26,080
you know.
590
00:34:26,500 --> 00:34:31,720
If you know how to administrate
better SQL server on Windows,
591
00:34:31,720 --> 00:34:34,400
then that's probably the best database
for you.
592
00:34:35,440 --> 00:34:36,680
It's not for me.
593
00:34:37,060 --> 00:34:43,220
And if you are more successful
with the NULL behavior in document
594
00:34:43,260 --> 00:34:46,580
databases, then probably you should
use document databases.
595
00:34:47,440 --> 00:34:52,360
So my goal is just to have people
be successful and use the right
596
00:34:52,360 --> 00:34:54,660
database depending on what they
know.
597
00:34:55,240 --> 00:35:02,840
The worst that you can do is work
with MongoDB and do the same
598
00:35:02,840 --> 00:35:06,480
design as you did on the SQL database
or the opposite.
599
00:35:07,300 --> 00:35:10,940
Putting everything in document
in Postgres just because you have
600
00:35:10,940 --> 00:35:14,600
learned MongoDB first, that will
probably not be good.
601
00:35:14,600 --> 00:35:18,340
You need to understand how it works,
read an execution plan in
602
00:35:18,340 --> 00:35:21,220
both case, understand how the indexes
are used.
603
00:35:23,400 --> 00:35:26,720
Michael: I kind of agree for products
where you're the only user
604
00:35:26,720 --> 00:35:31,520
like if I'm choosing between iOS
and Android or we were talking
605
00:35:31,520 --> 00:35:35,000
before the call about macOS or
Windows if I'm the only person
606
00:35:35,000 --> 00:35:38,940
affected I understand choosing
what I know best, but I feel like
607
00:35:38,940 --> 00:35:43,020
with databases we're often choosing
for a team for an organization
608
00:35:43,260 --> 00:35:47,880
for a company And it's not just
what I know best, even if I'm
609
00:35:47,880 --> 00:35:50,920
the tech lead or, you know, even
if I am the decision maker,
610
00:35:50,920 --> 00:35:53,600
I need to factor in what do my
team know best?
611
00:35:53,600 --> 00:35:55,080
What can we hire most easily?
612
00:35:55,080 --> 00:35:56,420
What's easiest to operate?
613
00:35:56,460 --> 00:35:59,480
Or how long will this project last?
614
00:35:59,480 --> 00:36:02,480
Is it a proof of concept project
or is it our main system you
615
00:36:02,480 --> 00:36:06,240
know it's a bunch of other factors
I think are really important
616
00:36:06,400 --> 00:36:09,020
and do you think you brought up
use cases at the beginning I
617
00:36:09,020 --> 00:36:12,140
think that's like super important
because we often do know the
618
00:36:12,140 --> 00:36:15,040
use cases we often do know the
access patterns so picking the
619
00:36:15,040 --> 00:36:19,120
1 that is best for that makes more
sense to me than like which
620
00:36:19,120 --> 00:36:23,000
1 I know best personally but I
do take your point that if you
621
00:36:23,000 --> 00:36:26,140
if you take that as like an organization
which 1 do you operationally
622
00:36:26,180 --> 00:36:29,760
know best as an organization like
that it does still fit but
623
00:36:29,760 --> 00:36:32,300
I do think there's some subtle
difference there what do you think
624
00:36:35,320 --> 00:36:39,200
Franck: I think that there are
a lot of use cases that can be
625
00:36:39,200 --> 00:36:41,780
successful on many databases.
626
00:36:42,940 --> 00:36:48,120
Of course, there are some special
cases that are really put at
627
00:36:48,980 --> 00:36:53,040
the maximum throughput needed,
where you have really to define
628
00:36:53,720 --> 00:36:55,580
the right technology for it.
629
00:36:55,900 --> 00:36:58,700
But let's say you have time series.
630
00:36:59,800 --> 00:37:03,060
Time series coming from IoT and
you have queries on them.
631
00:37:03,340 --> 00:37:08,300
Of course, you can use a time series
database, but you can also
632
00:37:08,560 --> 00:37:12,180
do it on Postgres with a time series
extension or not.
633
00:37:12,440 --> 00:37:16,260
And you can also do it on a document
database.
634
00:37:16,840 --> 00:37:21,420
If you do it correctly, I think
you have a lot of choices for
635
00:37:21,420 --> 00:37:22,620
many use cases.
636
00:37:23,040 --> 00:37:31,220
And finally, the enterprises that
need a specific database because
637
00:37:31,320 --> 00:37:37,160
of the very high scale of it, they
finally build their own database
638
00:37:38,460 --> 00:37:44,300
or they trick the 1 database to
use it freely like their own
639
00:37:44,300 --> 00:37:44,800
database.
640
00:37:45,360 --> 00:37:48,340
But I think you really have the
choice.
641
00:37:48,820 --> 00:37:52,540
Many use cases, you can do that
on Postgres, you can do that
642
00:37:52,540 --> 00:37:56,760
on Yuga, but you can do that on
Oracle, you can do that on MongoDB,
643
00:37:56,920 --> 00:37:58,760
you can do that on DynamoDB.
644
00:37:59,440 --> 00:38:04,120
But if you do it in a database
where you don't know exactly how
645
00:38:04,120 --> 00:38:09,440
NULL works or how the isolation,
the ACID properties, the locks
646
00:38:09,440 --> 00:38:15,080
are working, then you can also
be successful on any database
647
00:38:15,300 --> 00:38:20,320
for many use cases, but you can
also be very bad in any database
648
00:38:21,580 --> 00:38:22,780
if you don't care.
649
00:38:22,780 --> 00:38:26,700
So it's more about the people,
I totally agree, not your personal
650
00:38:26,800 --> 00:38:28,940
choice, about the people.
651
00:38:28,940 --> 00:38:33,780
And I remember discussions when
I was doing consulting, I remember
652
00:38:33,800 --> 00:38:38,960
discussing with a customer for
something where it would have
653
00:38:38,960 --> 00:38:43,580
made sense to use stored procedure
and they were growing all
654
00:38:43,580 --> 00:38:45,800
microservices, Java, all that.
655
00:38:46,160 --> 00:38:51,880
And they just told me, yeah, but
if we do it in SQL, PL/SQL was
656
00:38:51,880 --> 00:38:57,180
on Oracle at that time, we are
4 in the team who can do that
657
00:38:57,180 --> 00:38:58,480
and maintain that.
658
00:38:58,660 --> 00:39:02,580
And then if any problem is there,
we are 4 to be on call.
659
00:39:02,760 --> 00:39:08,000
If we do it in Java, we have 200
developers in India, we have
660
00:39:08,000 --> 00:39:09,900
200 developers in US.
661
00:39:09,960 --> 00:39:13,220
If there is a problem during the
night, they will manage it.
662
00:39:13,480 --> 00:39:17,060
So the good choice, Even if it's
not the best for performance,
663
00:39:17,120 --> 00:39:20,180
for design, for whatever, the good
choice is is also something
664
00:39:20,220 --> 00:39:24,100
where you can sleep and have a
team that can manage it.
665
00:39:24,520 --> 00:39:27,840
Nikolay: Well, right now, AI can
help you fix bugs, tests, and
666
00:39:27,840 --> 00:39:28,540
so on.
667
00:39:29,600 --> 00:39:30,060
Oh, yeah.
668
00:39:30,060 --> 00:39:31,300
It's easier, right?
669
00:39:31,460 --> 00:39:34,960
I have a couple of questions from
friends, and I think you know
670
00:39:34,960 --> 00:39:37,060
them, but I'm not going to reveal
names.
671
00:39:38,300 --> 00:39:41,980
First question, is MongoDB adding
SQL to the product?
672
00:39:45,060 --> 00:39:45,220
I don't
673
00:39:45,220 --> 00:39:48,060
Franck: think this is in the roadmap
at all.
674
00:39:48,480 --> 00:39:51,260
And I don't think people are asking
for that.
675
00:39:51,900 --> 00:39:55,580
Let's look at another SQL database,
DynamoDB.
676
00:39:56,980 --> 00:40:01,500
When DynamoDB added the SQL syntax
on top of it using PartiQL,
677
00:40:02,840 --> 00:40:04,100
it was never used.
678
00:40:05,440 --> 00:40:11,720
And the main reason was that users
were afraid of it because
679
00:40:11,720 --> 00:40:17,620
with the API that, with the document
API, they know what happens.
680
00:40:18,040 --> 00:40:22,040
The big difference, I mentioned
the API, but there is a big difference
681
00:40:22,060 --> 00:40:23,820
between NoSQL and SQL.
682
00:40:23,820 --> 00:40:29,740
In SQL, you have a declarative
language where you don't know
683
00:40:29,760 --> 00:40:34,400
how the data is accessed until
you read the execution plan.
684
00:40:36,420 --> 00:40:39,680
Which is good because you have
an application that is independent
685
00:40:39,820 --> 00:40:44,580
of the physical data model, but
it's also more difficult because
686
00:40:44,580 --> 00:40:49,180
the developer has no idea how it
works in production before looking
687
00:40:49,180 --> 00:40:50,420
at the execution plan.
688
00:40:50,900 --> 00:40:54,820
And when looking at the execution
plan, the developer may have
689
00:40:54,820 --> 00:40:59,700
to work a long time to understand
why the bad execution plan
690
00:40:59,700 --> 00:41:00,460
is chosen.
691
00:41:00,660 --> 00:41:03,680
Is it because of statistics, not
good index, whatever, it's kind
692
00:41:03,680 --> 00:41:04,380
of complex.
693
00:41:05,160 --> 00:41:11,300
With the NoSQL APIs, you code the
data access.
694
00:41:11,860 --> 00:41:13,400
So it depends on the database.
695
00:41:13,420 --> 00:41:16,200
For example, in DynamoDB, if you
want to use an index, you have
696
00:41:16,200 --> 00:41:17,380
to query the index.
697
00:41:17,860 --> 00:41:21,480
In MongoDB, you have this data
independence where you query on
698
00:41:21,480 --> 00:41:24,900
the collection, and if the index
can be used, it can be used.
699
00:41:25,160 --> 00:41:27,840
But you control the data that is
accessed.
700
00:41:27,840 --> 00:41:31,360
For example, when you design your
documents, You design something
701
00:41:33,820 --> 00:41:38,480
that is joined when you insert
it, not at run time, where a query
702
00:41:38,480 --> 00:41:42,280
planner will decide if it starts
with 1 table or another table.
703
00:41:42,980 --> 00:41:44,840
And it has some good and bad.
704
00:41:45,440 --> 00:41:49,340
I remember in consulting, spending
a long time with developers,
705
00:41:50,500 --> 00:41:55,020
looking at the execution plan and
they know their data and they
706
00:41:55,020 --> 00:41:59,060
know their access pattern and they
immediately tell me, of course,
707
00:41:59,060 --> 00:42:01,100
that's not the right execution
plan.
708
00:42:01,100 --> 00:42:04,580
We must start with this table and
then look up into this 1.
709
00:42:05,020 --> 00:42:05,920
Okay, perfect.
710
00:42:06,340 --> 00:42:11,260
I can use an int pg_hint_plan, for
example, in Postgres to validate
711
00:42:11,260 --> 00:42:13,940
that it's a better execution plan.
712
00:42:14,120 --> 00:42:15,580
And then the developer is happy.
713
00:42:15,580 --> 00:42:16,340
Yeah, perfect.
714
00:42:16,340 --> 00:42:17,200
I want that.
715
00:42:17,220 --> 00:42:20,140
And then they're like, okay, but
it's not finished.
716
00:42:20,600 --> 00:42:25,200
Now, we need to figure out how
to get the right execution plan
717
00:42:25,200 --> 00:42:26,540
without the hint.
718
00:42:27,440 --> 00:42:32,220
And with consulting, people were
paying the day just to get the
719
00:42:32,220 --> 00:42:36,220
right execution plan that they
know initially was the best 1.
720
00:42:36,760 --> 00:42:41,740
With an OSQL API, you are closer
to what happens physically and
721
00:42:41,740 --> 00:42:44,580
then you have more control on that
and some developers prefer
722
00:42:44,580 --> 00:42:45,080
that.
723
00:42:46,500 --> 00:42:50,440
Nikolay: Next question was, what
do you think Postgres can or
724
00:42:50,440 --> 00:42:51,800
should learn from MongoDB?
725
00:42:52,080 --> 00:42:53,260
Maybe this, right?
726
00:42:53,940 --> 00:42:55,340
Is it possible to...
727
00:42:55,460 --> 00:42:56,560
Michael: I have 1 more.
728
00:42:57,880 --> 00:43:00,180
I think they do major upgrades
really well.
729
00:43:01,100 --> 00:43:01,800
Franck: Oh, yes.
730
00:43:02,780 --> 00:43:03,260
Well...
731
00:43:03,260 --> 00:43:05,260
Michael: But we can learn that
from a lot of databases.
732
00:43:07,200 --> 00:43:11,920
Nikolay: Yeah, previous question
was because I had like maybe
733
00:43:11,920 --> 00:43:17,060
outdated knowledge that many NoSQL
systems implemented some dialect
734
00:43:17,080 --> 00:43:20,960
of SQL, for example, Cassandra
with CQL, right?
735
00:43:21,980 --> 00:43:23,040
Franck: Yeah, but they...
736
00:43:23,480 --> 00:43:24,220
Nikolay: Not used.
737
00:43:24,520 --> 00:43:27,440
Franck: It's only syntax, it's
not SQL, it's not a declarative
738
00:43:27,620 --> 00:43:29,000
language, it's just syntax.
739
00:43:29,440 --> 00:43:30,700
I don't see the point.
740
00:43:32,900 --> 00:43:33,200
Nikolay: If you
741
00:43:33,200 --> 00:43:36,340
Franck: have an API that is integrated
with your programming
742
00:43:36,340 --> 00:43:41,380
language, why do you want to write
a string in Java that you
743
00:43:41,380 --> 00:43:43,760
send to the database if you don't
have to?
744
00:43:44,280 --> 00:43:48,060
In SQL, You have to do that because
you have this data independence
745
00:43:48,240 --> 00:43:49,700
and very different language.
746
00:43:50,140 --> 00:43:52,080
But I don't really see the point.
747
00:43:52,540 --> 00:43:53,980
But I forgot what you mentioned.
748
00:43:54,340 --> 00:43:58,180
Nikolay: Yeah, I said vice versa
what Postgres could learn from.
749
00:43:59,280 --> 00:44:00,860
Michael answered upgrades.
750
00:44:01,160 --> 00:44:03,400
I concur with you, definitely.
751
00:44:04,900 --> 00:44:06,300
Franck: But that is related.
752
00:44:07,540 --> 00:44:12,500
In SQL databases, in relational
databases, to have this data
753
00:44:12,500 --> 00:44:15,860
independence, logical and physical
data independence, where you
754
00:44:15,860 --> 00:44:20,360
query, in SQL databases, you query
a logical model.
755
00:44:20,900 --> 00:44:22,380
We were talking about normalization.
756
00:44:22,900 --> 00:44:24,500
This is the logical model.
757
00:44:24,560 --> 00:44:27,100
Maybe physically everything is
stored in 1 table.
758
00:44:27,100 --> 00:44:31,620
You don't really care from the
relational SQL point of view.
759
00:44:31,800 --> 00:44:35,860
But then to map the logical model
to the physical model, you
760
00:44:35,860 --> 00:44:37,700
need a catalog, a dictionary.
761
00:44:38,300 --> 00:44:43,380
And this is what is difficult during
upgrades, because you need
762
00:44:43,380 --> 00:44:46,920
to change the catalog and the catalog
is shared.
763
00:44:47,400 --> 00:44:50,980
You can short the data, you can
distribute the data, but the
764
00:44:50,980 --> 00:44:55,620
catalog must be shared because
they must use the same dictionary.
765
00:44:56,400 --> 00:45:01,820
And that's easier with a NoSQL
database because you have much
766
00:45:01,820 --> 00:45:06,220
less to share about the metadata,
because the catalog is in the
767
00:45:06,220 --> 00:45:06,720
application.
768
00:45:07,400 --> 00:45:12,100
The schema, we were talking about
schemaless or schema on read
769
00:45:12,100 --> 00:45:12,820
or on write.
770
00:45:12,820 --> 00:45:16,820
The big difference is that Most
of the schema is in the application.
771
00:45:16,960 --> 00:45:19,780
And then if you upgrade the application,
you have a new version
772
00:45:20,080 --> 00:45:23,180
of the application, it knows the
new schema.
773
00:45:23,260 --> 00:45:26,660
And the 2 versions can work together
if you take care that when
774
00:45:26,660 --> 00:45:29,280
you read a document, you know how
to read it.
775
00:45:30,660 --> 00:45:31,500
Michael: Great answer.
776
00:45:32,100 --> 00:45:33,340
Nikolay: Yeah, last question.
777
00:45:33,420 --> 00:45:38,400
What do you think about systems
which are built on top of Postgres,
778
00:45:38,600 --> 00:45:42,680
like FerretDB and DocumentDB recently
released by Microsoft?
779
00:45:45,040 --> 00:45:45,980
Franck: That's a good point.
780
00:45:46,920 --> 00:45:52,860
So, beyond the funny thing that
DocumentDB is an AWS database,
781
00:45:54,400 --> 00:45:58,940
but the name belongs to Microsoft
because before putting a MongoDB
782
00:45:59,460 --> 00:46:03,780
like API on Cosmos DB, it was called
DocumentDB.
783
00:46:04,940 --> 00:46:09,720
So, Microsoft did that multiple
times, put it in Cosmos DB to
784
00:46:09,720 --> 00:46:11,500
see if it will be more popular.
785
00:46:11,980 --> 00:46:13,940
So first, it's a mess.
786
00:46:15,440 --> 00:46:20,400
Different API, similar, you don't
know the name where it comes
787
00:46:20,400 --> 00:46:25,880
from, but I really like what the
FerretDB people are doing.
788
00:46:26,400 --> 00:46:32,440
And for me, as a developer advocate,
I really like that there
789
00:46:32,440 --> 00:46:35,040
is a MongoDB API on multiple databases.
790
00:46:35,380 --> 00:46:38,260
In Oracle, you can also have a
MongoDB API.
791
00:46:39,280 --> 00:46:44,540
The more you make it popular, the
more you help users to use
792
00:46:44,540 --> 00:46:48,460
another API without changing the
database, that's perfect.
793
00:46:48,840 --> 00:46:52,100
From a marketing point of view,
I don't think it's a big problem
794
00:46:52,360 --> 00:46:56,420
either, because it's not only about
the API.
795
00:46:56,880 --> 00:47:02,980
What I think that the big customers
of MongoDB like with MongoDB
796
00:47:03,380 --> 00:47:08,000
is that they have in front a company
that is doing only 1 thing.
797
00:47:08,920 --> 00:47:11,060
The company is doing only MongoDB.
798
00:47:11,960 --> 00:47:16,220
It's not like Oracle that has a
database, but also another database
799
00:47:16,400 --> 00:47:19,420
and cloud and manage service and
software.
800
00:47:19,640 --> 00:47:21,240
MongoDB is doing only MongoDB.
801
00:47:21,700 --> 00:47:28,780
So if they use MongoDB on MongoDB, they have hundreds of people
802
00:47:28,780 --> 00:47:30,060
doing support on it.
803
00:47:30,060 --> 00:47:35,140
Nikolay: I cannot agree here because I remember MongoDB company,
804
00:47:35,380 --> 00:47:37,860
it's called Mongo or MongoDB, sorry...
805
00:47:37,860 --> 00:47:41,260
So I remember they also did some Postgres when they first released
806
00:47:41,260 --> 00:47:42,140
BI connector.
807
00:47:42,840 --> 00:47:43,980
Remember this story?
808
00:47:44,640 --> 00:47:45,280
They used Postgres.
809
00:47:45,280 --> 00:47:46,220
Franck: I have no idea.
810
00:47:46,980 --> 00:47:52,120
Nikolay: To be able to use Tableau and other systems for data
811
00:47:52,120 --> 00:47:55,740
analysis, BI and so on.
812
00:47:56,320 --> 00:48:01,120
They needed to make some bridge to SQL world and they used Postgres
813
00:48:01,120 --> 00:48:01,820
for that.
814
00:48:02,220 --> 00:48:02,980
It was very interesting.
815
00:48:02,980 --> 00:48:03,980
Franck: I have no idea.
816
00:48:04,120 --> 00:48:08,560
My point was more like, you can do some MongoDB on Percona, you
817
00:48:08,560 --> 00:48:13,580
can do some MongoDB on Oracle, you can do some MongoDB for FerretDB
818
00:48:14,540 --> 00:48:15,320
on Azure.
819
00:48:16,020 --> 00:48:17,180
And that can work.
820
00:48:17,180 --> 00:48:20,840
But if you are a big customer and want support, you probably
821
00:48:21,960 --> 00:48:25,580
want support from the original 1.
822
00:48:26,400 --> 00:48:31,500
Nikolay: I hear you speaking as a member of this team, new member
823
00:48:31,500 --> 00:48:37,400
of this team, but I also have like my must have a note that MongoDB
824
00:48:37,440 --> 00:48:38,900
is not pure open source.
825
00:48:40,240 --> 00:48:42,540
Franck: It is not pure open source, yeah.
826
00:48:42,540 --> 00:48:46,120
Nikolay: Well, FerretDB is Apache 2.0, which is pure open source.
827
00:48:46,120 --> 00:48:47,420
So this is 1 of...
828
00:48:47,440 --> 00:48:48,120
Franck: Yeah, yeah, yeah.
829
00:48:48,120 --> 00:48:50,640
Of course, I'm a big fan of open source.
830
00:48:50,640 --> 00:48:54,640
I would prefer that it is open source, but I can also understand.
831
00:48:55,960 --> 00:48:58,980
You know why they had to change the license?
832
00:48:59,040 --> 00:49:01,420
Because AWS was taking everything.
833
00:49:01,720 --> 00:49:05,780
And finally, today AWS is a major partner.
834
00:49:05,860 --> 00:49:08,620
So it was probably a good move.
835
00:49:09,180 --> 00:49:11,340
Probably today it could be open source.
836
00:49:11,420 --> 00:49:16,220
But yeah, I can understand given the history that they want to
837
00:49:16,220 --> 00:49:17,760
protect the managed service.
838
00:49:18,260 --> 00:49:20,900
Nikolay: Open source is eating commercial software, clouds are
839
00:49:20,900 --> 00:49:22,320
eating open source software.
840
00:49:22,540 --> 00:49:27,840
Yeah, you remember this sequence of fish picture, right?
841
00:49:27,980 --> 00:49:31,560
Yeah, okay, I think no more questions from me.
842
00:49:31,560 --> 00:49:34,240
It was very super interesting and yeah, enjoy.
843
00:49:34,240 --> 00:49:35,260
Thank you for coming.
844
00:49:36,380 --> 00:49:37,420
Franck: Thank you very much.
845
00:49:37,420 --> 00:49:41,980
I really like also what you do, how you can come with so many
846
00:49:41,980 --> 00:49:44,580
different topics on every week.
847
00:49:45,600 --> 00:49:49,340
I think you never missed a week for us.
848
00:49:49,960 --> 00:49:51,880
So yeah, that's really nice.
849
00:49:52,360 --> 00:49:52,860
Nikolay: Great.
850
00:49:53,940 --> 00:49:55,400
Michael: Really kind of you, Franck.
851
00:49:55,460 --> 00:49:56,420
Thank you for joining.
852
00:49:56,780 --> 00:49:57,480
Franck: Thank you.
853
00:49:58,320 --> 00:49:59,440
Nikolay: Have a great week.
00:00:00,060 --> 00:00:02,360
Michael: Hello and welcome to Postgres.FM, a weekly show about
2
00:00:02,360 --> 00:00:03,420
all things PostgreSQL.
3
00:00:03,420 --> 00:00:05,860
I am Michael, founder of pgMustard, and as usual, I'm joined
4
00:00:05,860 --> 00:00:07,680
by Nikolay, founder of Postgres.AI.
5
00:00:07,680 --> 00:00:08,420
Hey, Nikolay.
6
00:00:08,940 --> 00:00:09,740
Nikolay: Hi, Michael.
7
00:00:10,440 --> 00:00:13,940
Michael: And we have a special guest today, Franck Pachot, who
8
00:00:13,940 --> 00:00:18,100
is a developer advocate now at MongoDB, formerly at YugabyteDB,
9
00:00:18,480 --> 00:00:21,980
which is a distributed PostgreSQL database, also an AWS Data
10
00:00:21,980 --> 00:00:24,400
Hero, and Oracle Certified Master.
11
00:00:24,960 --> 00:00:26,540
So, welcome, Franck.
12
00:00:27,100 --> 00:00:27,600
Franck: Hi.
13
00:00:28,260 --> 00:00:28,760
Thanks.
14
00:00:28,940 --> 00:00:30,140
Thanks for having me there.
15
00:00:30,580 --> 00:00:32,560
Nikolay: And former Postgres blogger.
16
00:00:33,520 --> 00:00:34,020
Franck: Yeah.
17
00:00:34,460 --> 00:00:34,960
Nikolay: No?
18
00:00:34,980 --> 00:00:35,740
Or yes?
19
00:00:36,300 --> 00:00:37,120
Franck: Oh, yeah, yeah.
20
00:00:37,120 --> 00:00:40,760
I will continue to blog about all databases, it's just that it
21
00:00:40,760 --> 00:00:42,540
depends on the time I have.
22
00:00:42,700 --> 00:00:43,260
Nikolay: Sounds good.
23
00:00:43,260 --> 00:00:48,400
So I saw you are going to give a talk at some Postgres conference
24
00:00:48,400 --> 00:00:49,440
in India, right?
25
00:00:49,440 --> 00:00:51,400
PGConf India, I don't remember the name.
26
00:00:51,760 --> 00:00:53,660
So still planning to do it, right?
27
00:00:54,340 --> 00:00:54,840
Franck: Yeah.
28
00:00:55,080 --> 00:00:56,460
And also Germany.
29
00:00:56,580 --> 00:00:58,120
I just got the acceptance.
30
00:01:00,900 --> 00:01:01,820
Nikolay: I'm very curious.
31
00:01:02,600 --> 00:01:07,680
During daytime, you work using JSONs and these weird queries,
32
00:01:09,140 --> 00:01:10,620
right, chains of something.
33
00:01:11,420 --> 00:01:15,980
And then at weekend or something you present SQL talks.
34
00:01:16,120 --> 00:01:19,400
How is it going to be played in your mind?
35
00:01:19,400 --> 00:01:20,360
I'm very curious.
36
00:01:22,360 --> 00:01:24,180
Franck: It's all about databases.
37
00:01:24,680 --> 00:01:26,820
I mean, it's all the same.
38
00:01:27,700 --> 00:01:28,600
Nikolay: All the same.
39
00:01:29,640 --> 00:01:33,860
Franck: Yeah, you can do data modeling, document data modeling
40
00:01:33,860 --> 00:01:34,540
on Postgres.
41
00:01:34,560 --> 00:01:35,740
You can do it on Oracle.
42
00:01:35,740 --> 00:01:37,320
You can do it on MongoDB.
43
00:01:37,580 --> 00:01:43,840
You can normalize your data on SQL databases, on NoSQL databases.
44
00:01:44,440 --> 00:01:46,380
The concepts are all the same.
45
00:01:46,380 --> 00:01:51,020
Of course, there are little differences, like how NULLs are undulied,
46
00:01:51,020 --> 00:01:54,920
for example, or how you join or you don't join, but yeah.
47
00:01:54,920 --> 00:01:56,080
Nikolay: NULLs, let's postpone.
48
00:01:56,140 --> 00:01:57,340
It's a special topic.
49
00:01:57,340 --> 00:01:58,820
It's not for the start.
50
00:01:59,480 --> 00:01:59,980
Okay.
51
00:02:00,160 --> 00:02:06,240
I remember a series of blog posts from Michael Stonebraker about
52
00:02:06,600 --> 00:02:11,120
criticizing document databases for lack of normalization and
53
00:02:11,120 --> 00:02:11,820
so on.
54
00:02:12,010 --> 00:02:17,000
So you are saying now that it's totally possible to apply normalization
55
00:02:17,160 --> 00:02:18,560
in document database.
56
00:02:19,340 --> 00:02:20,900
Is this what you're trying to say?
57
00:02:20,900 --> 00:02:22,700
Or maybe I'm getting wrong.
58
00:02:24,840 --> 00:02:30,100
Franck: I've also changed my mind probably because for 2 reasons.
59
00:02:30,100 --> 00:02:32,360
First, the applications have changed.
60
00:02:32,860 --> 00:02:39,040
I think the normalized model was really good for those monolithic
61
00:02:39,220 --> 00:02:44,420
databases where all use cases with the enterprise information
62
00:02:44,600 --> 00:02:48,340
system in 1 database running all use cases.
63
00:02:48,440 --> 00:02:53,940
And then you need a normalized way to structure the data that
64
00:02:53,940 --> 00:02:57,540
is shared by the whole company and all kinds of users.
65
00:02:58,500 --> 00:03:00,120
Today, it's a bit different.
66
00:03:00,340 --> 00:03:02,940
You have multiple services, multiple microservices.
67
00:03:03,220 --> 00:03:05,640
They might have different databases.
68
00:03:06,780 --> 00:03:10,740
And then the concern of normalization may be different.
69
00:03:10,740 --> 00:03:15,540
For example, if you consume data only to read it and not update
70
00:03:15,580 --> 00:03:17,940
it, you can denormalize a bit more.
71
00:03:17,960 --> 00:03:22,500
So that's 1 reason and I think the main reason is also the applications
72
00:03:22,700 --> 00:03:23,740
have changed.
73
00:03:24,360 --> 00:03:30,660
Today in application programming languages you use documents
74
00:03:31,020 --> 00:03:37,400
in nested structure, objects, object graphs, looks like more
75
00:03:37,840 --> 00:03:42,460
like documents so it's easier to move it to applications.
76
00:03:43,620 --> 00:03:47,360
Nikolay: I don't get it because we had documents for forever.
77
00:03:47,620 --> 00:03:53,700
For example, Codd designed relational model originally dealing
78
00:03:53,700 --> 00:03:55,320
with banking systems, right?
79
00:03:56,780 --> 00:04:02,760
In 60s, 70s, and it was not convenient to have nesting at that
80
00:04:02,760 --> 00:04:03,260
point.
81
00:04:03,820 --> 00:04:08,040
Before rational model, we know there were what's the name like
82
00:04:08,240 --> 00:04:13,660
net and I forgot names, but basically closer to...
83
00:04:14,280 --> 00:04:17,000
Franck: Hierarchical models and network models.
84
00:04:17,220 --> 00:04:18,160
Nikolay: Yeah, yeah, yeah, exactly.
85
00:04:18,820 --> 00:04:25,740
And the idea was it's really inconvenient when we keep a document
86
00:04:25,960 --> 00:04:31,160
as a whole and we need to split it into pieces and basically
87
00:04:31,160 --> 00:04:32,360
divide and conquer, right?
88
00:04:32,360 --> 00:04:36,160
We split into pieces and that's how we get flexibility and start
89
00:04:36,160 --> 00:04:36,660
working.
90
00:04:36,900 --> 00:04:40,640
And we had documents at that time as well, like invoices or transactions
91
00:04:42,740 --> 00:04:45,080
like between financial institutions and so on.
92
00:04:45,440 --> 00:04:50,360
So I don't see the big change, just amount of data and so on,
93
00:04:50,360 --> 00:04:50,820
right?
94
00:04:50,820 --> 00:04:55,580
And I don't fully understand why the idea of microservices or
95
00:04:55,580 --> 00:05:00,320
something you, as I understand, you are bringing, like when we
96
00:05:00,320 --> 00:05:02,540
have many, many databases, many services.
97
00:05:02,900 --> 00:05:04,640
Why is it changing this?
98
00:05:04,640 --> 00:05:06,860
Because in my head, it's vice versa.
99
00:05:06,860 --> 00:05:13,440
If we have many services, we do need to structure and split into
100
00:05:14,380 --> 00:05:17,620
more atomic pieces of our data, right?
101
00:05:17,620 --> 00:05:22,320
And the article I mentioned, it's called "Schema Later Considered
102
00:05:22,340 --> 00:05:22,840
Harmful."
103
00:05:24,840 --> 00:05:29,400
After my post, actually, this is why I named my sub-transactions
104
00:05:29,760 --> 00:05:32,380
blog post also considered harmful.
105
00:05:33,080 --> 00:05:38,720
And some folks mentioned on Hacker News mentioned that there
106
00:05:38,720 --> 00:05:42,420
is an article considered harmful, considered harmful, harmful,
107
00:05:43,280 --> 00:05:45,320
considered harmful titles considered harmful.
108
00:05:45,360 --> 00:05:48,940
So it's basically like not a good way to name articles, but the
109
00:05:48,940 --> 00:05:50,280
blog post is quite good.
110
00:05:50,280 --> 00:05:55,840
Like if schema design, normalization still makes sense.
111
00:05:55,840 --> 00:05:59,180
If you don't do it, you deal with bad consequences later.
112
00:05:59,700 --> 00:06:00,860
So please let
113
00:06:00,860 --> 00:06:01,400
Franck: me understand.
114
00:06:01,400 --> 00:06:03,740
Yeah, but it depends on your use case.
115
00:06:04,020 --> 00:06:09,180
And also something I've been working on relational databases
116
00:06:09,300 --> 00:06:14,360
where you normalized, but basically, when I learned databases
117
00:06:14,680 --> 00:06:17,280
at university, it was all about normalization.
118
00:06:17,720 --> 00:06:21,620
And then when you start to work, you hear people talking about
119
00:06:21,620 --> 00:06:23,320
denormalizing everything.
120
00:06:24,120 --> 00:06:29,240
And of course, you just need to think about the access patterns.
121
00:06:29,800 --> 00:06:31,580
Nikolay: Yeah, Let me just add this.
122
00:06:31,640 --> 00:06:34,900
Sorry for interrupting, but let me just add, I totally agree.
123
00:06:34,900 --> 00:06:38,680
If we over-normalize, then we deal with very simple fact that
124
00:06:38,680 --> 00:06:40,980
you cannot create 1 index on 2 tables.
125
00:06:44,500 --> 00:06:47,960
You won't, Because, for example, filtering on 1 table, filtering
126
00:06:47,960 --> 00:06:50,420
on another table, you want a single index scan.
127
00:06:50,640 --> 00:06:54,780
Definitely, this is what we do also.
128
00:06:54,920 --> 00:06:59,160
My team and I, we do, during consulting practice, we say, okay,
129
00:06:59,160 --> 00:07:01,080
here we do need to normalize.
130
00:07:02,320 --> 00:07:07,120
But my point is, if you take Mongo and other document databases,
131
00:07:07,900 --> 00:07:10,740
they just provoke you to avoid normalization at all.
132
00:07:10,920 --> 00:07:13,340
In relational data systems, we can...
133
00:07:13,440 --> 00:07:14,340
Is it OK?
134
00:07:14,340 --> 00:07:15,140
Am I wrong?
135
00:07:16,120 --> 00:07:19,800
Franck: Yeah, for me, you are wrong.
136
00:07:20,860 --> 00:07:26,040
And I think that's also 1 reason MongoDB was interested to have
137
00:07:26,040 --> 00:07:30,980
a developer advocate coming from SQL databases, is that users
138
00:07:31,360 --> 00:07:36,300
tend to think that they have to denormalize everything and to
139
00:07:36,300 --> 00:07:39,260
put everything in 1 document, which is wrong.
140
00:07:40,120 --> 00:07:46,780
The idea in MongoDB is to put together what you insert together
141
00:07:46,800 --> 00:07:53,040
or what you query together, but in different documents if you
142
00:07:53,040 --> 00:07:54,180
query differently.
143
00:07:55,080 --> 00:08:00,300
Just to take an example, another entry system, you don't want
144
00:08:00,300 --> 00:08:03,540
to put together the customers and the orders because you don't
145
00:08:03,540 --> 00:08:09,400
want 1 document per customer where you just add orders that can
146
00:08:09,400 --> 00:08:11,540
be a lot every year.
147
00:08:11,600 --> 00:08:16,500
But the orders themselves, the orders and the other items which
148
00:08:16,500 --> 00:08:21,440
we usually put in 2 tables in SQL databases just because they
149
00:08:21,440 --> 00:08:22,780
have different cardinalities.
150
00:08:23,860 --> 00:08:27,780
That's something you can put in a single document, because you
151
00:08:27,780 --> 00:08:30,520
insert an order with all the items.
152
00:08:30,860 --> 00:08:34,680
You have nobody who will just update
1 item of the order and
153
00:08:34,680 --> 00:08:36,100
you query them together.
154
00:08:36,780 --> 00:08:38,360
Of course, it depends on the system.
155
00:08:38,360 --> 00:08:45,200
If you're in a system that analyzes
the order lines for marketing
156
00:08:45,220 --> 00:08:49,060
purpose, buy the product and you
don't care about the customer
157
00:08:49,060 --> 00:08:51,780
or the other, then maybe the modeling
is different.
158
00:08:51,780 --> 00:08:54,180
And this is where different use
cases are.
159
00:08:54,520 --> 00:08:58,280
But it's not about putting everything
in 1 document.
160
00:08:59,440 --> 00:09:03,940
And that's also why it's good to
do some design reviews?
161
00:09:04,120 --> 00:09:07,440
Because it's easy for a developer
to start and put everything
162
00:09:07,440 --> 00:09:12,260
in 1 document, just moving what
they have in Java to the database,
163
00:09:12,400 --> 00:09:16,280
but still needs design and still
need to think about what you
164
00:09:16,280 --> 00:09:21,440
embed, like denormalize, or what
you reference, like you would
165
00:09:21,440 --> 00:09:24,060
reference with foreign keys in
a secure database?
166
00:09:25,440 --> 00:09:26,400
Nikolay: OK, I hear you.
167
00:09:26,400 --> 00:09:27,940
I think I understand you.
168
00:09:28,620 --> 00:09:33,660
But still, You say users have this
tendency to think.
169
00:09:34,020 --> 00:09:39,900
For example, user Michael Stonebraker
says that he noticed that
170
00:09:40,680 --> 00:09:45,100
maybe it's possible to normalize,
of course, but in relational
171
00:09:45,140 --> 00:09:49,360
databases there is a big tendency
to normalize first and then
172
00:09:49,360 --> 00:09:51,100
denormalize when needed.
173
00:09:52,160 --> 00:09:56,180
In document store databases, there
is the opposite tendency.
174
00:09:56,980 --> 00:10:00,520
Avoid normalization first and then
normalize when we have pain.
175
00:10:01,400 --> 00:10:04,640
The whole article called "Schema
Later Considered Harmful."
176
00:10:04,640 --> 00:10:10,360
I think, as I understand this article,
it's about that the relational
177
00:10:10,520 --> 00:10:15,360
approach, direction of movement
is more beneficial in general
178
00:10:15,360 --> 00:10:17,040
case than opposite.
179
00:10:17,040 --> 00:10:17,980
What do you think?
180
00:10:19,060 --> 00:10:24,960
Franck: Yeah, but remember that
relational databases were made
181
00:10:24,960 --> 00:10:29,340
at a time where we were designing
the data before looking at
182
00:10:29,340 --> 00:10:30,260
the use cases.
183
00:10:31,160 --> 00:10:36,020
The normalization and the data
model doesn't care about the use
184
00:10:36,020 --> 00:10:36,520
cases.
185
00:10:37,340 --> 00:10:39,060
You just model the data.
186
00:10:39,200 --> 00:10:44,440
You have orders, multiple order
items, an order belongs to a
187
00:10:44,440 --> 00:10:44,940
customer.
188
00:10:45,400 --> 00:10:50,320
You do a static model of your data,
and then you bring the application
189
00:10:50,440 --> 00:10:55,760
use cases, and you can optimize
them with indexes, but you don't
190
00:10:55,760 --> 00:10:58,120
change the data model for the use
cases.
191
00:10:58,780 --> 00:11:03,840
But this is not really how applications
are developed today.
192
00:11:04,460 --> 00:11:10,080
Today, applications come with a
main use case and rent fast access
193
00:11:10,080 --> 00:11:11,300
for this use case.
194
00:11:11,820 --> 00:11:15,680
For another use case, they just
check if they can do it on the
195
00:11:15,680 --> 00:11:19,940
same database, or maybe do some
event streaming, put that in
196
00:11:19,940 --> 00:11:21,860
another database and doing elsewhere.
197
00:11:23,000 --> 00:11:24,260
That really has changed.
198
00:11:24,720 --> 00:11:31,040
Today, even applications that run
on SQL databases, I see people
199
00:11:31,640 --> 00:11:35,580
starting a data model, knowing
the access patterns.
200
00:11:38,040 --> 00:11:39,740
And then maybe you can denormalize.
201
00:11:40,120 --> 00:11:43,740
For example, it's okay to denormalize
something that is not updated.
202
00:11:45,060 --> 00:11:49,200
The big danger to denormalize something
that may be updated is
203
00:11:49,200 --> 00:11:53,940
that you have to update in multiple
places, which is a risk of
204
00:11:53,940 --> 00:11:57,900
inconsistency if you forget 1,
and which is also a performance
205
00:11:58,040 --> 00:12:01,080
issue, especially when you distribute,
then you have distributed
206
00:12:01,160 --> 00:12:03,020
transactions at multiple places.
207
00:12:03,620 --> 00:12:09,020
But data that you do not update,
and there is a lot of data that
208
00:12:09,020 --> 00:12:11,760
we don't update, we just add a
new version of it.
209
00:12:11,760 --> 00:12:17,420
For example, a customer is creating
a new order, you will not
210
00:12:17,420 --> 00:12:18,500
update the order.
211
00:12:18,820 --> 00:12:24,380
If we add a new item, that will
be a new order, but the existing
212
00:12:24,380 --> 00:12:26,020
order has been validated.
213
00:12:26,180 --> 00:12:28,780
You don't update this data later.
214
00:12:29,240 --> 00:12:32,860
Usually you have a timestamp, And
even if you change something,
215
00:12:32,860 --> 00:12:34,540
then you just add the new version.
216
00:12:34,540 --> 00:12:36,940
So the applications have changed.
217
00:12:36,940 --> 00:12:39,740
And I'm not saying that 1 is better
than the other.
218
00:12:39,740 --> 00:12:44,980
But when we listen to the developers,
we see that they don't
219
00:12:44,980 --> 00:12:49,020
want to build this ERD diagram.
220
00:12:50,220 --> 00:12:51,340
That was never true.
221
00:12:51,340 --> 00:12:52,580
So that's also something.
222
00:12:53,040 --> 00:12:56,060
Nikolay: Nobody does that anymore,
building ERD diagrams.
223
00:12:56,400 --> 00:13:01,480
Or only our AI system does, but
it's just a side function for
224
00:13:01,480 --> 00:13:01,980
it.
225
00:13:02,140 --> 00:13:06,220
But I don't understand why we cannot
do it on relational databases
226
00:13:06,340 --> 00:13:08,080
and still have all the good stuff.
227
00:13:08,080 --> 00:13:13,400
Because we have JSON, let's just
put it there and so on.
228
00:13:14,680 --> 00:13:18,240
Franck: And It's very good to mix
both.
229
00:13:18,240 --> 00:13:22,620
I've seen a lot of applications
on Oracle, on Postgres, on Yugabyte,
230
00:13:23,680 --> 00:13:29,040
where it's a mix where you have
tables with Columns because they
231
00:13:29,040 --> 00:13:33,420
are updated because you went indexes
on it, and you have a bunch
232
00:13:33,420 --> 00:13:37,040
of metadata information that you
put in a JSON.
233
00:13:37,540 --> 00:13:39,560
And that's also perfectly valid.
234
00:13:40,120 --> 00:13:45,220
Nikolay: And so what does Mongo
bring here, if we have it already?
235
00:13:46,080 --> 00:13:48,900
Franck: I think the API is very
different.
236
00:13:49,440 --> 00:13:50,140
Nikolay: Of course.
237
00:13:50,500 --> 00:13:51,000
Franck: Yeah.
238
00:13:51,260 --> 00:13:53,260
With MongoDB, you can really...
239
00:13:54,560 --> 00:13:56,880
You have your object graph in the
application.
240
00:13:57,340 --> 00:14:01,100
In JavaScript, it's even easier,
but in Java, in whatever, in
241
00:14:01,100 --> 00:14:05,460
Python, and you just communicate
with the Database those documents
242
00:14:05,600 --> 00:14:07,880
and they are stored as documents.
243
00:14:09,180 --> 00:14:13,020
The big problem with SQL databases
or so something that has changed
244
00:14:13,420 --> 00:14:17,960
when Application have changed at
the time where everything was
245
00:14:17,960 --> 00:14:23,860
done in the Database, stored
procedures or pre-compiled procedures
246
00:14:24,060 --> 00:14:26,500
or whatever, then that was okay.
247
00:14:26,820 --> 00:14:32,300
But with object-oriented programming,
you had this mismatch and
248
00:14:32,300 --> 00:14:36,940
you need an object-relational mapping
to map from 1 to the other
249
00:14:36,940 --> 00:14:44,240
if you don't want to do a bunch
of queries in text strings and
250
00:14:44,240 --> 00:14:45,220
through JDBC.
251
00:14:46,160 --> 00:14:54,140
So, what MongoDB brings at that
point is an API that really fits
252
00:14:54,520 --> 00:14:58,340
with the programming language and
then it stores it as documents
253
00:14:58,940 --> 00:15:02,260
rather than mapping that to relational
tables.
254
00:15:02,860 --> 00:15:06,740
Nikolay: Yes, this is what HDB
and HQL are trying to solve.
255
00:15:06,740 --> 00:15:12,600
They try to reinvent SQL to have
this, what you describe.
256
00:15:13,180 --> 00:15:18,720
Yeah, but you mentioned OOP and
ER.
257
00:15:19,020 --> 00:15:22,320
I think this is in the past already,
both.
258
00:15:22,440 --> 00:15:24,660
No, I'm joking, I'm joking.
259
00:15:25,600 --> 00:15:26,140
So for me
260
00:15:26,140 --> 00:15:26,600
Franck: it's like...
261
00:15:26,600 --> 00:15:29,240
Then what do you use today if you...
262
00:15:30,060 --> 00:15:32,820
I mean, applications are built
with objects?
263
00:15:33,700 --> 00:15:38,520
Nikolay: Well, I personally am
a big fan of things what guys
264
00:15:38,520 --> 00:15:45,560
like Hasura, Supabase, others
do with thin layer providing APIs
265
00:15:46,080 --> 00:15:50,040
right away without the need to
write this middleware.
266
00:15:51,600 --> 00:15:55,520
It's great, this serves better
than object-relational mapping.
267
00:15:55,520 --> 00:15:58,440
But people do object-relational
mapping, but at the same time,
268
00:15:58,440 --> 00:16:03,840
I doubt a lot of guys who create
projects, they do actual OOP
269
00:16:03,840 --> 00:16:05,440
with patterns and so on.
270
00:16:05,560 --> 00:16:08,800
It's kind of like somehow not cool
anymore.
271
00:16:08,940 --> 00:16:09,840
It's my perception.
272
00:16:11,240 --> 00:16:14,200
I'm far from actual application
programming lately.
273
00:16:14,200 --> 00:16:18,000
Franck: But it's also this old
debate where do you put your business
274
00:16:18,060 --> 00:16:18,560
logic?
275
00:16:19,540 --> 00:16:23,680
Ideally in a SQL database, you
put it in the database because
276
00:16:23,680 --> 00:16:27,320
data is processed there, but then
you are constrained to specific
277
00:16:27,440 --> 00:16:27,940
languages.
278
00:16:29,100 --> 00:16:30,160
Nikolay: Well, right.
279
00:16:30,480 --> 00:16:37,360
But if you put it to application,
you also have dependency on
280
00:16:37,360 --> 00:16:38,900
this language you chose.
281
00:16:38,900 --> 00:16:39,820
It's the same.
282
00:16:41,180 --> 00:16:47,920
To me, the question about where
to put logic became much easier
283
00:16:47,920 --> 00:16:52,900
to understand since like 10 years
ago when Angular and React,
284
00:16:52,900 --> 00:16:57,980
they obtained, gained popularity
and a lot of logic and actually
285
00:16:57,980 --> 00:17:01,080
Web 2.0, how many years ago already?
286
00:17:01,080 --> 00:17:02,780
Like 20 years ago, right?
287
00:17:02,920 --> 00:17:06,840
All these shifted a lot of client-oriented
logic to clients,
288
00:17:07,060 --> 00:17:08,500
to front-end, right?
289
00:17:08,760 --> 00:17:13,700
And this gave space to have logic
closer to data, like constraints
290
00:17:14,060 --> 00:17:18,680
and what we usually do with triggers,
some dependencies, propagation
291
00:17:18,820 --> 00:17:20,040
of changes or something.
292
00:17:20,860 --> 00:17:23,360
It gives opportunity to keep it
in database where it should be
293
00:17:23,360 --> 00:17:27,260
because otherwise, if you don't
do it closer to database, at
294
00:17:27,260 --> 00:17:31,420
some point when company grows,
project grows, you add some other
295
00:17:32,120 --> 00:17:37,800
tools or application layers or
something called, and you need
296
00:17:37,800 --> 00:17:40,780
to re-implement the same logic
in different places.
297
00:17:41,140 --> 00:17:43,860
And there is no strong guarantee
that it will be well maintained.
298
00:17:43,860 --> 00:17:44,620
Yeah, but the
299
00:17:44,620 --> 00:17:49,080
Franck: problem is just, I totally
agree, and there are very
300
00:17:49,080 --> 00:17:52,860
successful database-centric applications.
301
00:17:54,060 --> 00:17:59,560
But what developers want, they
want to use Java, not PL/pgSQL
302
00:18:00,060 --> 00:18:01,100
and not PL/SQL.
303
00:18:02,280 --> 00:18:08,460
And just because try to hire a
SQL developer or a PL/pgSQL developer,
304
00:18:08,680 --> 00:18:12,600
that will be more difficult than
hiring a team of Java developers.
305
00:18:13,620 --> 00:18:14,120
Nikolay: Right.
306
00:18:14,440 --> 00:18:14,940
Right.
307
00:18:15,300 --> 00:18:16,900
Michael wanted to ask something.
308
00:18:17,720 --> 00:18:20,280
Michael: I don't know if this is
a change of topic, but I think
309
00:18:20,280 --> 00:18:23,600
it's on the same path, which is
around developer experience.
310
00:18:23,600 --> 00:18:27,800
And I know it's a subjective term,
but I do think when, at least
311
00:18:27,800 --> 00:18:30,320
when Mongo went into the market,
but I think NoSQL databases
312
00:18:30,320 --> 00:18:32,480
in general, they promised a few
things.
313
00:18:32,480 --> 00:18:35,660
1 was a really good getting started
experience, a very quick,
314
00:18:35,760 --> 00:18:40,120
easy, you don't have to think much
type, no schema to worry about,
315
00:18:40,380 --> 00:18:41,540
and just get started.
316
00:18:41,660 --> 00:18:44,840
And that's good for some things
and not so good in other ways.
317
00:18:45,040 --> 00:18:46,880
But it also promised a couple of
other things.
318
00:18:46,880 --> 00:18:50,860
And I think we can learn a lot
from these things in terms of
319
00:18:50,860 --> 00:18:51,980
why was it popular?
320
00:18:52,060 --> 00:18:54,240
Like, why did Mongo take off?
321
00:18:54,240 --> 00:18:56,740
Why was NoSQL so popular for so
long?
322
00:18:56,980 --> 00:19:01,580
It also promised kind of infinite,
or at least horizontal scalability.
323
00:19:01,960 --> 00:19:04,200
And that's something we've historically
struggled with.
324
00:19:04,200 --> 00:19:07,600
I know you worked on distributed
SQL, but it's something we've
325
00:19:07,600 --> 00:19:10,500
historically struggled with in
the SQL world.
326
00:19:10,680 --> 00:19:14,700
And then, yeah, I think that combination
of things seemed really
327
00:19:14,700 --> 00:19:15,480
interesting to me.
328
00:19:15,480 --> 00:19:20,020
And I wondered if you had opinions
on what is it about that developer
329
00:19:20,020 --> 00:19:22,280
experience that really resonated
with people?
330
00:19:23,440 --> 00:19:27,080
Franck: For me, that's really developer
experience where MongoDB
331
00:19:28,080 --> 00:19:30,560
is really, was really successful.
332
00:19:31,580 --> 00:19:35,720
The scalability, I don't really
know because I didn't use MongoDB
333
00:19:35,820 --> 00:19:40,700
at that time, and then I've seen
scalability in SQL databases.
334
00:19:41,120 --> 00:19:45,140
The scalability comes from the
data model where you can have
335
00:19:45,140 --> 00:19:46,660
an easy sharding key.
336
00:19:46,700 --> 00:19:47,200
Yeah.
337
00:19:47,300 --> 00:19:51,140
As soon as you have an easy sharding
key, you can distribute
338
00:19:51,200 --> 00:19:54,660
that on mostly all databases today.
339
00:19:54,960 --> 00:19:59,440
On Postgres, you have multiple
options like Citus, like Aurora,
340
00:19:59,760 --> 00:20:02,700
Limitless, where If you have a
sharding key, you can distribute.
341
00:20:03,080 --> 00:20:05,080
I don't think it's really the point
today.
342
00:20:05,080 --> 00:20:07,300
The point is really develop your
experience.
343
00:20:07,300 --> 00:20:13,620
As you say, it's easy to start
and it's easy to integrate to
344
00:20:13,620 --> 00:20:15,320
your programming language also.
345
00:20:15,320 --> 00:20:20,860
Not having something else to learn,
a different language, but
346
00:20:20,860 --> 00:20:25,160
also a different behavior, thinking
about what you need to look,
347
00:20:25,160 --> 00:20:30,380
thinking about foreign keys, thinking
about performance when
348
00:20:30,380 --> 00:20:32,860
you read from multiple tables.
349
00:20:33,400 --> 00:20:37,800
But it's also, the easy to start
is also a problem.
350
00:20:37,800 --> 00:20:42,860
And basically I'm working in the
DevRel team where most of the
351
00:20:42,860 --> 00:20:49,640
job is helping users, developers
to do some proper data modeling
352
00:20:49,640 --> 00:20:50,140
design.
353
00:20:50,940 --> 00:20:53,860
Because it's easy to start, which
is good when you start a proof
354
00:20:53,860 --> 00:20:58,080
of concept, but at some point like
in any database, you need
355
00:20:58,080 --> 00:20:59,120
to do some design.
356
00:20:59,440 --> 00:21:03,840
And the more easy it is to start,
the more difficult it is to
357
00:21:03,840 --> 00:21:07,120
realize that, okay, we are not
in a proof of concept anymore,
358
00:21:07,120 --> 00:21:08,500
we'll put that in production.
359
00:21:08,740 --> 00:21:12,020
It's an application that will evolve
in the coming years.
360
00:21:12,040 --> 00:21:14,160
And then we need to look at the
design.
361
00:21:14,160 --> 00:21:20,140
And this is one of the major activity
in the DevRel team.
362
00:21:20,420 --> 00:21:24,440
It's not like being developer advocate
for Yugabyte was really
363
00:21:24,440 --> 00:21:27,740
about awareness because it's a
new database, so you just need
364
00:21:28,140 --> 00:21:29,540
to let people know it.
365
00:21:29,540 --> 00:21:31,620
MongoDB, people know it.
366
00:21:31,640 --> 00:21:36,760
You just need to make them successful
with maybe a bit more complex
367
00:21:36,780 --> 00:21:39,940
use cases and do some data modeling.
368
00:21:41,500 --> 00:21:46,320
Nikolay: So I have a question about
how your personal experience
369
00:21:46,640 --> 00:21:49,300
and this decision you made, obviously,
recently.
370
00:21:50,500 --> 00:21:54,660
It feels like you switched teams,
like in soccer or football.
371
00:21:55,960 --> 00:21:56,460
Right?
372
00:21:56,980 --> 00:22:03,700
So my question was, any, like,
transfer cost?
373
00:22:04,660 --> 00:22:07,440
Franck: Ah, that's a very good
question.
374
00:22:07,580 --> 00:22:09,740
So let me explain how it was.
375
00:22:10,200 --> 00:22:15,280
I was really happy at Yugabyte, about
the team, about the colleagues,
376
00:22:15,280 --> 00:22:16,240
about the product.
377
00:22:16,440 --> 00:22:19,180
I was really not looking for another
job.
378
00:22:19,300 --> 00:22:22,860
And when other companies contacted
me, I was like, oh, sorry,
379
00:22:22,960 --> 00:22:24,520
I'm happy where I am.
380
00:22:24,640 --> 00:22:29,180
And when MongoDB contacted me,
it was more by curiosity, like
381
00:22:29,240 --> 00:22:33,980
why an SQL databases is interested
by my experience.
382
00:22:34,940 --> 00:22:38,600
And this is why I started discussions
by curiosity.
383
00:22:39,340 --> 00:22:43,920
And then this is where I realized
that it was really an interesting
384
00:22:43,940 --> 00:22:48,800
approach that's helping users on
document databases with the
385
00:22:48,800 --> 00:22:53,040
knowledge of SQL databases, being
able to discuss with those
386
00:22:53,040 --> 00:22:56,940
who use Postgres, who use MongoDB,
who have a new use case, they
387
00:22:56,940 --> 00:23:00,440
want to know if they can do it
on both or one is better than the
388
00:23:00,440 --> 00:23:00,940
other.
389
00:23:01,380 --> 00:23:02,380
That was interesting.
390
00:23:03,420 --> 00:23:07,040
And I was like, OK, I should think
about that.
391
00:23:07,640 --> 00:23:11,440
And then, of course, there is an
offer that was interesting enough
392
00:23:11,440 --> 00:23:14,340
to say, OK, why waiting, just going
there?
393
00:23:14,340 --> 00:23:18,300
But I could have the same offer
from Yugabyte.
394
00:23:19,020 --> 00:23:22,700
So it's not really what makes the
decision.
395
00:23:23,400 --> 00:23:28,300
Maybe it just push you to say,
why not now rather than waiting
396
00:23:28,580 --> 00:23:30,040
6 months or 1 year?
397
00:23:30,300 --> 00:23:33,700
But no, the point was really learning
something new.
398
00:23:33,700 --> 00:23:35,960
I really like learning something
new.
399
00:23:36,040 --> 00:23:40,340
And all the content I create is
me about learning.
400
00:23:41,820 --> 00:23:42,940
Nikolay: Yeah, well, yeah.
401
00:23:43,100 --> 00:23:46,080
My first reaction was, of course,
I became very upset.
402
00:23:46,760 --> 00:23:52,860
And I started to think, is it like
sudden change of your views
403
00:23:54,120 --> 00:24:00,460
or maybe you slowly became more
unsatisfied with state of relational
404
00:24:00,460 --> 00:24:02,300
and SQL world and so on.
405
00:24:02,300 --> 00:24:07,160
So I asked our AI assistant, and
as you know, we have all your
406
00:24:07,160 --> 00:24:08,000
blog posts.
407
00:24:08,420 --> 00:24:12,800
So I asked to research among blog
posts where you talked about
408
00:24:12,800 --> 00:24:18,960
NoSQL and SQL, and to my surprise,
it said you had such posts
409
00:24:18,960 --> 00:24:22,000
in the past and it's not a sudden
change of views.
410
00:24:22,080 --> 00:24:25,620
So the result from AI was it's
not a sudden change of views.
411
00:24:25,680 --> 00:24:31,580
But when I start, I asked to dig
deeper, It was obvious that
412
00:24:31,980 --> 00:24:37,160
maybe the key reason was nulls
in your past blog posts.
413
00:24:38,500 --> 00:24:41,980
The key criticism point was how
null behavior.
414
00:24:42,440 --> 00:24:44,340
And I was going to raise this.
415
00:24:44,340 --> 00:24:47,400
I did it during the weekend and
I was going to discuss this but
416
00:24:47,400 --> 00:24:51,420
as I already tweeted or x'd I don't
know how to say it.
417
00:24:51,420 --> 00:24:55,120
Yesterday, what happened yesterday
in the morning, my team made
418
00:24:55,120 --> 00:24:59,480
mistake and I actually I looked
at that merge request myself
419
00:25:00,140 --> 00:25:05,100
so it was not null safe operation
leading to nasty bug, which
420
00:25:05,220 --> 00:25:09,340
led to multiple companies receiving
emails from us, actually
421
00:25:09,340 --> 00:25:12,020
a few emails from us, with wrong
data.
422
00:25:12,360 --> 00:25:17,100
And it was because of just comparison,
not involving three-value
423
00:25:17,160 --> 00:25:17,660
logic.
424
00:25:18,400 --> 00:25:21,540
And I was beaten by this so many
times.
425
00:25:21,540 --> 00:25:26,660
I had a startup where I was stuck,
my own startup, I was stuck
426
00:25:26,660 --> 00:25:29,160
7 months without growth.
427
00:25:29,700 --> 00:25:34,320
Although I knew there should be
growth, but there is no growth
428
00:25:34,600 --> 00:25:39,880
and then I almost gave up and then
I digged deeper into the code
429
00:25:39,880 --> 00:25:44,220
and found this bug again not null
safe comparison we fixed it
430
00:25:44,220 --> 00:25:48,500
and in a few weeks we had 80,000
registrations per day.
431
00:25:49,600 --> 00:25:51,640
I almost gave up on that startup.
432
00:25:51,880 --> 00:25:57,180
This was like all nothing kind
of, you know, it's just, it's
433
00:25:57,180 --> 00:26:01,740
distinct from or distinct like
or coalesce, you can fix it in
434
00:26:01,920 --> 00:26:02,780
multiple ways.
435
00:26:02,860 --> 00:26:07,200
But if you overlook it's just a
single line of problem that which
436
00:26:07,200 --> 00:26:09,500
can cost you a lot of money and
time.
437
00:26:09,960 --> 00:26:14,020
And like maybe whole startup can
depend on it as in my story.
438
00:26:14,020 --> 00:26:18,980
So I'm definitely with you in the
criticism of null and not in
439
00:26:19,240 --> 00:26:20,780
with null values, right?
440
00:26:21,820 --> 00:26:26,820
Franck: I'm not really criticizing
it because I love the free
441
00:26:26,820 --> 00:26:27,760
value logic.
442
00:26:28,140 --> 00:26:32,380
I love nulls because I think I
understand it.
443
00:26:32,980 --> 00:26:34,300
Nikolay: I also think I understand.
444
00:26:34,300 --> 00:26:35,580
I also love exactly.
445
00:26:36,220 --> 00:26:36,980
Yeah, yeah, yeah.
446
00:26:37,860 --> 00:26:40,680
Franck: But it took me 20 years
to understand it.
447
00:26:40,680 --> 00:26:44,180
And then I can understand that
a developer who already has a
448
00:26:44,180 --> 00:26:49,300
lot of things to learn, do not
want to spend time on something
449
00:26:49,300 --> 00:26:50,880
that looks like mathematics.
450
00:26:53,040 --> 00:26:53,820
Nikolay: It's good.
451
00:26:54,020 --> 00:26:57,240
It's kind of like I kind of came
from academia, right?
452
00:26:57,500 --> 00:27:01,780
And I learned quickly during my
university time because I had
453
00:27:01,780 --> 00:27:06,580
a very good professor, a big specialist
in databases, and I quickly
454
00:27:06,580 --> 00:27:07,340
learned it.
455
00:27:07,540 --> 00:27:11,600
But it took me 20 years to stop
liking it because I see reality
456
00:27:11,740 --> 00:27:15,760
says nobody, nobody, like everyone
steps on this rake all the
457
00:27:15,760 --> 00:27:16,980
time, including myself.
458
00:27:17,920 --> 00:27:19,460
Franck: Yeah, you need to be pragmatic.
459
00:27:19,780 --> 00:27:25,080
But also, you can also solve all
problems in SQL databases.
460
00:27:25,580 --> 00:27:27,020
Just don't use NULL.
461
00:27:27,400 --> 00:27:29,780
Just set all columns, not null.
462
00:27:30,040 --> 00:27:30,860
And that works.
463
00:27:30,920 --> 00:27:32,580
And you were talking about normalization.
464
00:27:33,900 --> 00:27:36,000
Just normalize a bit more.
465
00:27:36,260 --> 00:27:41,420
If you are tempted to put a NULL
in a column, then it's probably
466
00:27:41,520 --> 00:27:44,700
because this column belongs to another
table.
467
00:27:45,040 --> 00:27:48,200
And then it will not be a NULL,
it will be the absence of a row
468
00:27:48,200 --> 00:27:49,340
in another table.
469
00:27:51,200 --> 00:27:58,040
Just go forward, full normalization,
and do not allow any NULL,
470
00:27:58,260 --> 00:27:59,620
and that will work.
471
00:27:59,760 --> 00:28:00,400
I mean,
472
00:28:00,860 --> 00:28:01,840
Nikolay: It will work, but
473
00:28:01,840 --> 00:28:03,160
Franck: you will not have those
errors.
474
00:28:03,160 --> 00:28:05,320
Maybe you will have some performance
issues.
475
00:28:05,420 --> 00:28:05,920
Nikolay: Exactly.
476
00:28:06,820 --> 00:28:08,700
Performance issues will be inevitable.
477
00:28:10,260 --> 00:28:13,340
Franck: I see NULL like denormalization.
478
00:28:14,060 --> 00:28:16,040
It's a shortcut that is easy.
479
00:28:16,040 --> 00:28:21,900
It's so easy just to say, okay,
let's put a NULL because it doesn't
480
00:28:21,900 --> 00:28:22,740
have a value.
481
00:28:23,400 --> 00:28:26,980
If it doesn't have a value, it
should not have a row in the table.
482
00:28:28,260 --> 00:28:28,760
Nikolay: Yeah.
483
00:28:29,040 --> 00:28:36,620
I also remember, like, imagine
you have CTO or some leader who
484
00:28:36,620 --> 00:28:37,660
understands NULLs.
485
00:28:38,380 --> 00:28:42,180
Imagine all those poor application
developers who write Java,
486
00:28:42,180 --> 00:28:50,040
JavaScript, doesn't matter, PHP
code, Ruby code, and this CTO
487
00:28:50,160 --> 00:28:55,520
with this understanding of NULLs
in SQL constantly putting pressure
488
00:28:55,580 --> 00:28:59,320
like you again you used it wrong
in your code and I was this
489
00:28:59,320 --> 00:29:03,620
person and right now I'm like I
think just NULLs is
490
00:29:03,620 --> 00:29:03,920
Franck: a good
491
00:29:03,920 --> 00:29:09,320
Nikolay: concept but the world
says please no it just doesn't
492
00:29:09,320 --> 00:29:12,520
work well So that's why I say I
don't like them.
493
00:29:12,520 --> 00:29:14,120
Franck: I will take another analogy.
494
00:29:14,440 --> 00:29:17,060
I think the best editor is VI.
495
00:29:18,040 --> 00:29:18,940
Because I also
496
00:29:18,940 --> 00:29:19,340
Nikolay: agree to
497
00:29:19,340 --> 00:29:20,240
Franck: learn it.
498
00:29:20,380 --> 00:29:22,440
Yeah, we had to learn it
499
00:29:22,440 --> 00:29:23,500
Nikolay: inside TMAX.
500
00:29:23,560 --> 00:29:25,840
Franck: It was hard to learn it,
we had to learn it.
501
00:29:25,840 --> 00:29:28,800
But when you know it, you are very
efficient with it.
502
00:29:28,980 --> 00:29:33,580
But I can understand that a junior
today do not want to learn
503
00:29:33,640 --> 00:29:34,940
all those VI commands.
504
00:29:36,040 --> 00:29:37,060
Same for null.
505
00:29:37,240 --> 00:29:42,140
I mean, if you learn it and if
you spend all your life doing
506
00:29:42,160 --> 00:29:44,640
SQL, then, yeah, it's good.
507
00:29:45,060 --> 00:29:46,960
But that's not the reality.
508
00:29:47,660 --> 00:29:52,440
Nikolay: Yeah, so back to Monga,
and let's talk a little bit
509
00:29:52,440 --> 00:29:58,380
about the alternative and if we
go out of SQL world, but stay
510
00:29:58,380 --> 00:30:03,060
inside databases, what's happening
to nulls and empty values,
511
00:30:03,080 --> 00:30:04,900
unknown values and so on.
512
00:30:05,540 --> 00:30:08,080
Zeros, empty strings.
513
00:30:08,860 --> 00:30:11,620
Should it be considered all the
same or no?
514
00:30:15,020 --> 00:30:17,540
Franck: In SQL, for me in SQL it's
easy.
515
00:30:17,560 --> 00:30:21,440
A null is a value that exists,
but you just don't know the value.
516
00:30:24,220 --> 00:30:28,280
Your top manager has a salary,
but you don't know it.
517
00:30:28,840 --> 00:30:33,280
So if you have to put all salaries
in a database, then you will
518
00:30:33,280 --> 00:30:33,960
have a null.
519
00:30:33,960 --> 00:30:37,120
And maybe you will put it 1 day,
just because you don't know
520
00:30:37,120 --> 00:30:39,360
it yet at the time where you insert.
521
00:30:40,080 --> 00:30:44,980
The problem is that null is used
for other things, for something
522
00:30:45,060 --> 00:30:46,220
that doesn't exist.
523
00:30:46,220 --> 00:30:49,540
You know, when in Excel we say
NA, doesn't apply.
524
00:30:50,580 --> 00:30:56,200
And if you use this as doesn't
apply in JVa script, you're just
525
00:30:56,200 --> 00:30:59,860
trying to store it and have the
same logic when you query the
526
00:30:59,860 --> 00:31:00,360
database.
527
00:31:00,860 --> 00:31:02,540
So MongoDB does that.
528
00:31:02,780 --> 00:31:05,040
It's very similar to not exist.
529
00:31:05,080 --> 00:31:08,880
You have those documents where
you can declare an attribute or
530
00:31:08,880 --> 00:31:09,380
not.
531
00:31:09,960 --> 00:31:14,440
And in most cases, if it's not
there, it's similar to null.
532
00:31:15,240 --> 00:31:19,300
And if you want to say explicitly
it exists but I don't know
533
00:31:19,300 --> 00:31:24,740
the value, then add something else,
like a boolean that says,
534
00:31:24,740 --> 00:31:26,540
okay, we don't know it.
535
00:31:28,700 --> 00:31:29,200
Nikolay: Yeah.
536
00:31:29,280 --> 00:31:32,120
By the way, You mentioned you like
it, it's a good concept, but
537
00:31:32,120 --> 00:31:37,120
I'm thinking, so many caveats,
for example, if you take null
538
00:31:37,120 --> 00:31:40,940
value and do plus 1, it will be
also null, like unknown, remains
539
00:31:40,940 --> 00:31:44,020
unknown, because we don't know
what we're using.
540
00:31:44,340 --> 00:31:44,700
If you
541
00:31:44,700 --> 00:31:48,000
Franck: don't know a value, then
you can add 1 and you still
542
00:31:48,000 --> 00:31:49,100
don't know the value.
543
00:31:49,540 --> 00:31:52,800
Nikolay: If you say at the same
time if you use aggregate sum
544
00:31:53,360 --> 00:31:56,620
it's not like that it uses 0 instead
of now right?
545
00:31:58,580 --> 00:32:01,880
Franck: Yeah because you sum the
use it's defined as summing
546
00:32:01,880 --> 00:32:03,820
the known values.
547
00:32:03,820 --> 00:32:05,880
Nikolay: You cannot explain this,
it's not logical.
548
00:32:05,900 --> 00:32:13,160
It's just as is, because sum is
just plus 1 argument, plus different,
549
00:32:13,480 --> 00:32:17,440
just a sequence of plus operations,
right?
550
00:32:18,620 --> 00:32:18,900
Franck: But...
551
00:32:18,900 --> 00:32:21,400
Depends on how you define the aggregation.
552
00:32:22,300 --> 00:32:24,940
If it's even the sum of the known
value...
553
00:32:26,680 --> 00:32:32,760
Nikolay: If we have 3 rows, salary,
like $1, $2, and NULL dollars,
554
00:32:32,780 --> 00:32:33,680
NULL, right?
555
00:32:33,680 --> 00:32:34,180
Yeah.
556
00:32:34,200 --> 00:32:40,380
If we just perform explicit summarization,
the result will be
557
00:32:40,380 --> 00:32:40,880
NULL.
558
00:32:40,960 --> 00:32:43,660
But if we use sum, we should be
the same result.
559
00:32:43,660 --> 00:32:44,760
It will be not the same.
560
00:32:44,760 --> 00:32:45,740
It will be 3.
561
00:32:47,500 --> 00:32:50,460
Franck: Depends on how you define
it, but SQL defines that as
562
00:32:50,460 --> 00:32:53,040
the sum of the values that you
know.
563
00:32:54,840 --> 00:32:55,400
Nikolay: I apologize.
564
00:32:55,400 --> 00:32:55,840
It gives
565
00:32:55,840 --> 00:32:58,520
Franck: you an idea, and it makes
sense.
566
00:32:58,520 --> 00:33:03,660
I mean, if you have 1000000 rows
and you ask for a sum, you probably
567
00:33:03,720 --> 00:33:07,540
don't run an unknown just because
1 is not known.
568
00:33:07,540 --> 00:33:11,500
At least you know the sum of the
existing ones.
569
00:33:12,100 --> 00:33:14,440
Nikolay: Let me apologize and explain
what's happening here.
570
00:33:14,440 --> 00:33:19,660
I just flipped the board and made
you defend the SQL world, which
571
00:33:19,660 --> 00:33:23,300
is interesting because it shows
that you have courage to become
572
00:33:23,300 --> 00:33:24,520
specialist in both worlds.
573
00:33:24,520 --> 00:33:25,380
This is interesting.
574
00:33:27,440 --> 00:33:33,220
Franck: For me, I changed the company
and I help different users,
575
00:33:33,380 --> 00:33:37,460
but I did not change what I think
about databases.
576
00:33:37,720 --> 00:33:40,840
I mean, I've been working a lot
with Oracle, I still think it's
577
00:33:40,840 --> 00:33:43,860
a very good database, but I can
understand that people want to
578
00:33:43,860 --> 00:33:47,380
move out of it, and it's probably
not because of the features.
579
00:33:47,720 --> 00:33:51,380
I like Postgres, but I also think
that there is something else
580
00:33:51,380 --> 00:33:54,560
to do in the storage and to distribute
it.
581
00:33:54,640 --> 00:33:59,020
I like YugabyteDB, but I also understand
that some people may
582
00:33:59,020 --> 00:34:00,960
want to use something else.
583
00:34:01,360 --> 00:34:02,380
Same for MongoDB.
584
00:34:04,020 --> 00:34:08,160
I just want to help users when
I can help them.
585
00:34:08,560 --> 00:34:13,980
And also something, especially
on Twitter, but we see a lot of
586
00:34:13,980 --> 00:34:18,200
people comparing databases like
MySQL is better than Postgres
587
00:34:18,220 --> 00:34:21,220
or Postgres is better than MySQL
or whatever.
588
00:34:21,820 --> 00:34:25,360
And what I always say is that the
best database is the 1 that
589
00:34:25,360 --> 00:34:26,080
you know.
590
00:34:26,500 --> 00:34:31,720
If you know how to administrate
better SQL server on Windows,
591
00:34:31,720 --> 00:34:34,400
then that's probably the best database
for you.
592
00:34:35,440 --> 00:34:36,680
It's not for me.
593
00:34:37,060 --> 00:34:43,220
And if you are more successful
with the NULL behavior in document
594
00:34:43,260 --> 00:34:46,580
databases, then probably you should
use document databases.
595
00:34:47,440 --> 00:34:52,360
So my goal is just to have people
be successful and use the right
596
00:34:52,360 --> 00:34:54,660
database depending on what they
know.
597
00:34:55,240 --> 00:35:02,840
The worst that you can do is work
with MongoDB and do the same
598
00:35:02,840 --> 00:35:06,480
design as you did on the SQL database
or the opposite.
599
00:35:07,300 --> 00:35:10,940
Putting everything in document
in Postgres just because you have
600
00:35:10,940 --> 00:35:14,600
learned MongoDB first, that will
probably not be good.
601
00:35:14,600 --> 00:35:18,340
You need to understand how it works,
read an execution plan in
602
00:35:18,340 --> 00:35:21,220
both case, understand how the indexes
are used.
603
00:35:23,400 --> 00:35:26,720
Michael: I kind of agree for products
where you're the only user
604
00:35:26,720 --> 00:35:31,520
like if I'm choosing between iOS
and Android or we were talking
605
00:35:31,520 --> 00:35:35,000
before the call about macOS or
Windows if I'm the only person
606
00:35:35,000 --> 00:35:38,940
affected I understand choosing
what I know best, but I feel like
607
00:35:38,940 --> 00:35:43,020
with databases we're often choosing
for a team for an organization
608
00:35:43,260 --> 00:35:47,880
for a company And it's not just
what I know best, even if I'm
609
00:35:47,880 --> 00:35:50,920
the tech lead or, you know, even
if I am the decision maker,
610
00:35:50,920 --> 00:35:53,600
I need to factor in what do my
team know best?
611
00:35:53,600 --> 00:35:55,080
What can we hire most easily?
612
00:35:55,080 --> 00:35:56,420
What's easiest to operate?
613
00:35:56,460 --> 00:35:59,480
Or how long will this project last?
614
00:35:59,480 --> 00:36:02,480
Is it a proof of concept project
or is it our main system you
615
00:36:02,480 --> 00:36:06,240
know it's a bunch of other factors
I think are really important
616
00:36:06,400 --> 00:36:09,020
and do you think you brought up
use cases at the beginning I
617
00:36:09,020 --> 00:36:12,140
think that's like super important
because we often do know the
618
00:36:12,140 --> 00:36:15,040
use cases we often do know the
access patterns so picking the
619
00:36:15,040 --> 00:36:19,120
1 that is best for that makes more
sense to me than like which
620
00:36:19,120 --> 00:36:23,000
1 I know best personally but I
do take your point that if you
621
00:36:23,000 --> 00:36:26,140
if you take that as like an organization
which 1 do you operationally
622
00:36:26,180 --> 00:36:29,760
know best as an organization like
that it does still fit but
623
00:36:29,760 --> 00:36:32,300
I do think there's some subtle
difference there what do you think
624
00:36:35,320 --> 00:36:39,200
Franck: I think that there are
a lot of use cases that can be
625
00:36:39,200 --> 00:36:41,780
successful on many databases.
626
00:36:42,940 --> 00:36:48,120
Of course, there are some special
cases that are really put at
627
00:36:48,980 --> 00:36:53,040
the maximum throughput needed,
where you have really to define
628
00:36:53,720 --> 00:36:55,580
the right technology for it.
629
00:36:55,900 --> 00:36:58,700
But let's say you have time series.
630
00:36:59,800 --> 00:37:03,060
Time series coming from IoT and
you have queries on them.
631
00:37:03,340 --> 00:37:08,300
Of course, you can use a time series
database, but you can also
632
00:37:08,560 --> 00:37:12,180
do it on Postgres with a time series
extension or not.
633
00:37:12,440 --> 00:37:16,260
And you can also do it on a document
database.
634
00:37:16,840 --> 00:37:21,420
If you do it correctly, I think
you have a lot of choices for
635
00:37:21,420 --> 00:37:22,620
many use cases.
636
00:37:23,040 --> 00:37:31,220
And finally, the enterprises that
need a specific database because
637
00:37:31,320 --> 00:37:37,160
of the very high scale of it, they
finally build their own database
638
00:37:38,460 --> 00:37:44,300
or they trick the 1 database to
use it freely like their own
639
00:37:44,300 --> 00:37:44,800
database.
640
00:37:45,360 --> 00:37:48,340
But I think you really have the
choice.
641
00:37:48,820 --> 00:37:52,540
Many use cases, you can do that
on Postgres, you can do that
642
00:37:52,540 --> 00:37:56,760
on Yuga, but you can do that on
Oracle, you can do that on MongoDB,
643
00:37:56,920 --> 00:37:58,760
you can do that on DynamoDB.
644
00:37:59,440 --> 00:38:04,120
But if you do it in a database
where you don't know exactly how
645
00:38:04,120 --> 00:38:09,440
NULL works or how the isolation,
the ACID properties, the locks
646
00:38:09,440 --> 00:38:15,080
are working, then you can also
be successful on any database
647
00:38:15,300 --> 00:38:20,320
for many use cases, but you can
also be very bad in any database
648
00:38:21,580 --> 00:38:22,780
if you don't care.
649
00:38:22,780 --> 00:38:26,700
So it's more about the people,
I totally agree, not your personal
650
00:38:26,800 --> 00:38:28,940
choice, about the people.
651
00:38:28,940 --> 00:38:33,780
And I remember discussions when
I was doing consulting, I remember
652
00:38:33,800 --> 00:38:38,960
discussing with a customer for
something where it would have
653
00:38:38,960 --> 00:38:43,580
made sense to use stored procedure
and they were growing all
654
00:38:43,580 --> 00:38:45,800
microservices, Java, all that.
655
00:38:46,160 --> 00:38:51,880
And they just told me, yeah, but
if we do it in SQL, PL/SQL was
656
00:38:51,880 --> 00:38:57,180
on Oracle at that time, we are
4 in the team who can do that
657
00:38:57,180 --> 00:38:58,480
and maintain that.
658
00:38:58,660 --> 00:39:02,580
And then if any problem is there,
we are 4 to be on call.
659
00:39:02,760 --> 00:39:08,000
If we do it in Java, we have 200
developers in India, we have
660
00:39:08,000 --> 00:39:09,900
200 developers in US.
661
00:39:09,960 --> 00:39:13,220
If there is a problem during the
night, they will manage it.
662
00:39:13,480 --> 00:39:17,060
So the good choice, Even if it's
not the best for performance,
663
00:39:17,120 --> 00:39:20,180
for design, for whatever, the good
choice is is also something
664
00:39:20,220 --> 00:39:24,100
where you can sleep and have a
team that can manage it.
665
00:39:24,520 --> 00:39:27,840
Nikolay: Well, right now, AI can
help you fix bugs, tests, and
666
00:39:27,840 --> 00:39:28,540
so on.
667
00:39:29,600 --> 00:39:30,060
Oh, yeah.
668
00:39:30,060 --> 00:39:31,300
It's easier, right?
669
00:39:31,460 --> 00:39:34,960
I have a couple of questions from
friends, and I think you know
670
00:39:34,960 --> 00:39:37,060
them, but I'm not going to reveal
names.
671
00:39:38,300 --> 00:39:41,980
First question, is MongoDB adding
SQL to the product?
672
00:39:45,060 --> 00:39:45,220
I don't
673
00:39:45,220 --> 00:39:48,060
Franck: think this is in the roadmap
at all.
674
00:39:48,480 --> 00:39:51,260
And I don't think people are asking
for that.
675
00:39:51,900 --> 00:39:55,580
Let's look at another SQL database,
DynamoDB.
676
00:39:56,980 --> 00:40:01,500
When DynamoDB added the SQL syntax
on top of it using PartiQL,
677
00:40:02,840 --> 00:40:04,100
it was never used.
678
00:40:05,440 --> 00:40:11,720
And the main reason was that users
were afraid of it because
679
00:40:11,720 --> 00:40:17,620
with the API that, with the document
API, they know what happens.
680
00:40:18,040 --> 00:40:22,040
The big difference, I mentioned
the API, but there is a big difference
681
00:40:22,060 --> 00:40:23,820
between NoSQL and SQL.
682
00:40:23,820 --> 00:40:29,740
In SQL, you have a declarative
language where you don't know
683
00:40:29,760 --> 00:40:34,400
how the data is accessed until
you read the execution plan.
684
00:40:36,420 --> 00:40:39,680
Which is good because you have
an application that is independent
685
00:40:39,820 --> 00:40:44,580
of the physical data model, but
it's also more difficult because
686
00:40:44,580 --> 00:40:49,180
the developer has no idea how it
works in production before looking
687
00:40:49,180 --> 00:40:50,420
at the execution plan.
688
00:40:50,900 --> 00:40:54,820
And when looking at the execution
plan, the developer may have
689
00:40:54,820 --> 00:40:59,700
to work a long time to understand
why the bad execution plan
690
00:40:59,700 --> 00:41:00,460
is chosen.
691
00:41:00,660 --> 00:41:03,680
Is it because of statistics, not
good index, whatever, it's kind
692
00:41:03,680 --> 00:41:04,380
of complex.
693
00:41:05,160 --> 00:41:11,300
With the NoSQL APIs, you code the
data access.
694
00:41:11,860 --> 00:41:13,400
So it depends on the database.
695
00:41:13,420 --> 00:41:16,200
For example, in DynamoDB, if you
want to use an index, you have
696
00:41:16,200 --> 00:41:17,380
to query the index.
697
00:41:17,860 --> 00:41:21,480
In MongoDB, you have this data
independence where you query on
698
00:41:21,480 --> 00:41:24,900
the collection, and if the index
can be used, it can be used.
699
00:41:25,160 --> 00:41:27,840
But you control the data that is
accessed.
700
00:41:27,840 --> 00:41:31,360
For example, when you design your
documents, You design something
701
00:41:33,820 --> 00:41:38,480
that is joined when you insert
it, not at run time, where a query
702
00:41:38,480 --> 00:41:42,280
planner will decide if it starts
with 1 table or another table.
703
00:41:42,980 --> 00:41:44,840
And it has some good and bad.
704
00:41:45,440 --> 00:41:49,340
I remember in consulting, spending
a long time with developers,
705
00:41:50,500 --> 00:41:55,020
looking at the execution plan and
they know their data and they
706
00:41:55,020 --> 00:41:59,060
know their access pattern and they
immediately tell me, of course,
707
00:41:59,060 --> 00:42:01,100
that's not the right execution
plan.
708
00:42:01,100 --> 00:42:04,580
We must start with this table and
then look up into this 1.
709
00:42:05,020 --> 00:42:05,920
Okay, perfect.
710
00:42:06,340 --> 00:42:11,260
I can use an int pg_hint_plan, for
example, in Postgres to validate
711
00:42:11,260 --> 00:42:13,940
that it's a better execution plan.
712
00:42:14,120 --> 00:42:15,580
And then the developer is happy.
713
00:42:15,580 --> 00:42:16,340
Yeah, perfect.
714
00:42:16,340 --> 00:42:17,200
I want that.
715
00:42:17,220 --> 00:42:20,140
And then they're like, okay, but
it's not finished.
716
00:42:20,600 --> 00:42:25,200
Now, we need to figure out how
to get the right execution plan
717
00:42:25,200 --> 00:42:26,540
without the hint.
718
00:42:27,440 --> 00:42:32,220
And with consulting, people were
paying the day just to get the
719
00:42:32,220 --> 00:42:36,220
right execution plan that they
know initially was the best 1.
720
00:42:36,760 --> 00:42:41,740
With an OSQL API, you are closer
to what happens physically and
721
00:42:41,740 --> 00:42:44,580
then you have more control on that
and some developers prefer
722
00:42:44,580 --> 00:42:45,080
that.
723
00:42:46,500 --> 00:42:50,440
Nikolay: Next question was, what
do you think Postgres can or
724
00:42:50,440 --> 00:42:51,800
should learn from MongoDB?
725
00:42:52,080 --> 00:42:53,260
Maybe this, right?
726
00:42:53,940 --> 00:42:55,340
Is it possible to...
727
00:42:55,460 --> 00:42:56,560
Michael: I have 1 more.
728
00:42:57,880 --> 00:43:00,180
I think they do major upgrades
really well.
729
00:43:01,100 --> 00:43:01,800
Franck: Oh, yes.
730
00:43:02,780 --> 00:43:03,260
Well...
731
00:43:03,260 --> 00:43:05,260
Michael: But we can learn that
from a lot of databases.
732
00:43:07,200 --> 00:43:11,920
Nikolay: Yeah, previous question
was because I had like maybe
733
00:43:11,920 --> 00:43:17,060
outdated knowledge that many NoSQL
systems implemented some dialect
734
00:43:17,080 --> 00:43:20,960
of SQL, for example, Cassandra
with CQL, right?
735
00:43:21,980 --> 00:43:23,040
Franck: Yeah, but they...
736
00:43:23,480 --> 00:43:24,220
Nikolay: Not used.
737
00:43:24,520 --> 00:43:27,440
Franck: It's only syntax, it's
not SQL, it's not a declarative
738
00:43:27,620 --> 00:43:29,000
language, it's just syntax.
739
00:43:29,440 --> 00:43:30,700
I don't see the point.
740
00:43:32,900 --> 00:43:33,200
Nikolay: If you
741
00:43:33,200 --> 00:43:36,340
Franck: have an API that is integrated
with your programming
742
00:43:36,340 --> 00:43:41,380
language, why do you want to write
a string in Java that you
743
00:43:41,380 --> 00:43:43,760
send to the database if you don't
have to?
744
00:43:44,280 --> 00:43:48,060
In SQL, You have to do that because
you have this data independence
745
00:43:48,240 --> 00:43:49,700
and very different language.
746
00:43:50,140 --> 00:43:52,080
But I don't really see the point.
747
00:43:52,540 --> 00:43:53,980
But I forgot what you mentioned.
748
00:43:54,340 --> 00:43:58,180
Nikolay: Yeah, I said vice versa
what Postgres could learn from.
749
00:43:59,280 --> 00:44:00,860
Michael answered upgrades.
750
00:44:01,160 --> 00:44:03,400
I concur with you, definitely.
751
00:44:04,900 --> 00:44:06,300
Franck: But that is related.
752
00:44:07,540 --> 00:44:12,500
In SQL databases, in relational
databases, to have this data
753
00:44:12,500 --> 00:44:15,860
independence, logical and physical
data independence, where you
754
00:44:15,860 --> 00:44:20,360
query, in SQL databases, you query
a logical model.
755
00:44:20,900 --> 00:44:22,380
We were talking about normalization.
756
00:44:22,900 --> 00:44:24,500
This is the logical model.
757
00:44:24,560 --> 00:44:27,100
Maybe physically everything is
stored in 1 table.
758
00:44:27,100 --> 00:44:31,620
You don't really care from the
relational SQL point of view.
759
00:44:31,800 --> 00:44:35,860
But then to map the logical model
to the physical model, you
760
00:44:35,860 --> 00:44:37,700
need a catalog, a dictionary.
761
00:44:38,300 --> 00:44:43,380
And this is what is difficult during
upgrades, because you need
762
00:44:43,380 --> 00:44:46,920
to change the catalog and the catalog
is shared.
763
00:44:47,400 --> 00:44:50,980
You can short the data, you can
distribute the data, but the
764
00:44:50,980 --> 00:44:55,620
catalog must be shared because
they must use the same dictionary.
765
00:44:56,400 --> 00:45:01,820
And that's easier with a NoSQL
database because you have much
766
00:45:01,820 --> 00:45:06,220
less to share about the metadata,
because the catalog is in the
767
00:45:06,220 --> 00:45:06,720
application.
768
00:45:07,400 --> 00:45:12,100
The schema, we were talking about
schemaless or schema on read
769
00:45:12,100 --> 00:45:12,820
or on write.
770
00:45:12,820 --> 00:45:16,820
The big difference is that Most
of the schema is in the application.
771
00:45:16,960 --> 00:45:19,780
And then if you upgrade the application,
you have a new version
772
00:45:20,080 --> 00:45:23,180
of the application, it knows the
new schema.
773
00:45:23,260 --> 00:45:26,660
And the 2 versions can work together
if you take care that when
774
00:45:26,660 --> 00:45:29,280
you read a document, you know how
to read it.
775
00:45:30,660 --> 00:45:31,500
Michael: Great answer.
776
00:45:32,100 --> 00:45:33,340
Nikolay: Yeah, last question.
777
00:45:33,420 --> 00:45:38,400
What do you think about systems
which are built on top of Postgres,
778
00:45:38,600 --> 00:45:42,680
like FerretDB and DocumentDB recently
released by Microsoft?
779
00:45:45,040 --> 00:45:45,980
Franck: That's a good point.
780
00:45:46,920 --> 00:45:52,860
So, beyond the funny thing that
DocumentDB is an AWS database,
781
00:45:54,400 --> 00:45:58,940
but the name belongs to Microsoft
because before putting a MongoDB
782
00:45:59,460 --> 00:46:03,780
like API on Cosmos DB, it was called
DocumentDB.
783
00:46:04,940 --> 00:46:09,720
So, Microsoft did that multiple
times, put it in Cosmos DB to
784
00:46:09,720 --> 00:46:11,500
see if it will be more popular.
785
00:46:11,980 --> 00:46:13,940
So first, it's a mess.
786
00:46:15,440 --> 00:46:20,400
Different API, similar, you don't
know the name where it comes
787
00:46:20,400 --> 00:46:25,880
from, but I really like what the
FerretDB people are doing.
788
00:46:26,400 --> 00:46:32,440
And for me, as a developer advocate,
I really like that there
789
00:46:32,440 --> 00:46:35,040
is a MongoDB API on multiple databases.
790
00:46:35,380 --> 00:46:38,260
In Oracle, you can also have a
MongoDB API.
791
00:46:39,280 --> 00:46:44,540
The more you make it popular, the
more you help users to use
792
00:46:44,540 --> 00:46:48,460
another API without changing the
database, that's perfect.
793
00:46:48,840 --> 00:46:52,100
From a marketing point of view,
I don't think it's a big problem
794
00:46:52,360 --> 00:46:56,420
either, because it's not only about
the API.
795
00:46:56,880 --> 00:47:02,980
What I think that the big customers
of MongoDB like with MongoDB
796
00:47:03,380 --> 00:47:08,000
is that they have in front a company
that is doing only 1 thing.
797
00:47:08,920 --> 00:47:11,060
The company is doing only MongoDB.
798
00:47:11,960 --> 00:47:16,220
It's not like Oracle that has a
database, but also another database
799
00:47:16,400 --> 00:47:19,420
and cloud and manage service and
software.
800
00:47:19,640 --> 00:47:21,240
MongoDB is doing only MongoDB.
801
00:47:21,700 --> 00:47:28,780
So if they use MongoDB on MongoDB, they have hundreds of people
802
00:47:28,780 --> 00:47:30,060
doing support on it.
803
00:47:30,060 --> 00:47:35,140
Nikolay: I cannot agree here because I remember MongoDB company,
804
00:47:35,380 --> 00:47:37,860
it's called Mongo or MongoDB, sorry...
805
00:47:37,860 --> 00:47:41,260
So I remember they also did some Postgres when they first released
806
00:47:41,260 --> 00:47:42,140
BI connector.
807
00:47:42,840 --> 00:47:43,980
Remember this story?
808
00:47:44,640 --> 00:47:45,280
They used Postgres.
809
00:47:45,280 --> 00:47:46,220
Franck: I have no idea.
810
00:47:46,980 --> 00:47:52,120
Nikolay: To be able to use Tableau and other systems for data
811
00:47:52,120 --> 00:47:55,740
analysis, BI and so on.
812
00:47:56,320 --> 00:48:01,120
They needed to make some bridge to SQL world and they used Postgres
813
00:48:01,120 --> 00:48:01,820
for that.
814
00:48:02,220 --> 00:48:02,980
It was very interesting.
815
00:48:02,980 --> 00:48:03,980
Franck: I have no idea.
816
00:48:04,120 --> 00:48:08,560
My point was more like, you can do some MongoDB on Percona, you
817
00:48:08,560 --> 00:48:13,580
can do some MongoDB on Oracle, you can do some MongoDB for FerretDB
818
00:48:14,540 --> 00:48:15,320
on Azure.
819
00:48:16,020 --> 00:48:17,180
And that can work.
820
00:48:17,180 --> 00:48:20,840
But if you are a big customer and want support, you probably
821
00:48:21,960 --> 00:48:25,580
want support from the original 1.
822
00:48:26,400 --> 00:48:31,500
Nikolay: I hear you speaking as a member of this team, new member
823
00:48:31,500 --> 00:48:37,400
of this team, but I also have like my must have a note that MongoDB
824
00:48:37,440 --> 00:48:38,900
is not pure open source.
825
00:48:40,240 --> 00:48:42,540
Franck: It is not pure open source, yeah.
826
00:48:42,540 --> 00:48:46,120
Nikolay: Well, FerretDB is Apache 2.0, which is pure open source.
827
00:48:46,120 --> 00:48:47,420
So this is 1 of...
828
00:48:47,440 --> 00:48:48,120
Franck: Yeah, yeah, yeah.
829
00:48:48,120 --> 00:48:50,640
Of course, I'm a big fan of open source.
830
00:48:50,640 --> 00:48:54,640
I would prefer that it is open source, but I can also understand.
831
00:48:55,960 --> 00:48:58,980
You know why they had to change the license?
832
00:48:59,040 --> 00:49:01,420
Because AWS was taking everything.
833
00:49:01,720 --> 00:49:05,780
And finally, today AWS is a major partner.
834
00:49:05,860 --> 00:49:08,620
So it was probably a good move.
835
00:49:09,180 --> 00:49:11,340
Probably today it could be open source.
836
00:49:11,420 --> 00:49:16,220
But yeah, I can understand given the history that they want to
837
00:49:16,220 --> 00:49:17,760
protect the managed service.
838
00:49:18,260 --> 00:49:20,900
Nikolay: Open source is eating commercial software, clouds are
839
00:49:20,900 --> 00:49:22,320
eating open source software.
840
00:49:22,540 --> 00:49:27,840
Yeah, you remember this sequence of fish picture, right?
841
00:49:27,980 --> 00:49:31,560
Yeah, okay, I think no more questions from me.
842
00:49:31,560 --> 00:49:34,240
It was very super interesting and yeah, enjoy.
843
00:49:34,240 --> 00:49:35,260
Thank you for coming.
844
00:49:36,380 --> 00:49:37,420
Franck: Thank you very much.
845
00:49:37,420 --> 00:49:41,980
I really like also what you do, how you can come with so many
846
00:49:41,980 --> 00:49:44,580
different topics on every week.
847
00:49:45,600 --> 00:49:49,340
I think you never missed a week for us.
848
00:49:49,960 --> 00:49:51,880
So yeah, that's really nice.
849
00:49:52,360 --> 00:49:52,860
Nikolay: Great.
850
00:49:53,940 --> 00:49:55,400
Michael: Really kind of you, Franck.
851
00:49:55,460 --> 00:49:56,420
Thank you for joining.
852
00:49:56,780 --> 00:49:57,480
Franck: Thank you.
853
00:49:58,320 --> 00:49:59,440
Nikolay: Have a great week.