mongodb - 如何建模no-sql
问题描述
这是 RDBM 方法:
我有一个人员列表,因此名为 Person 的表:
id
name
country_id
然后我有一个国家表,名为 Country:
id
name
然后我插入以下行:
insert into country values(1, 'Macedonia');
insert into country values(2, 'England');
insert into person values(1, 'Mirko', 1);
insert into person values(2, 'Paul', 2);
然后听说国家“马其顿”改名为“北马其顿”
在 RDBM 中,我显然会这样做:
update country set name = 'North Macedonia' where id = 1;
那么,no-sql 是如何解决这个问题的呢?我猜有一个名为“Person”的文档可能有这样的结构:
{person_name: 'Mirko', country_name: 'Macedonia'}
{person_name: 'Paul', country_name: 'England'}
当我需要将“马其顿”更改为“北马其顿”时,我是否将所有出现的“马其顿”更新为“北马其顿”?这是最佳做法吗?因为我猜在 no-sql 中你不应该有个人文件和国家文件。我对吗?
解决方案
那么,no-sql 是如何解决这个问题的呢?我猜有一个名为“Person”的文档可能有这样的结构:
> {person_name: 'Mirko', country_name: 'Macedonia'}
> {person_name: 'Paul', country_name: 'England'}
一个国家和一个人之间的关系是一对多(1-N)。
但是,这是一对多关系的特例。通常,“多”方可以有 100 或 1000 个文档。在这个国家和其中的人的情况下,“多”的一面很可能是数百万甚至数亿。
因此,在这种情况下,唯一可用的表示是从“多”端引用关系“一”端的文档;那是从“人”中引用“国家”。
文件可能是这样的:
人:
_id
name
age
country_id: <refers to country collection's _id>
国家:
_id: <country's unique identifier>
country_name
total_population
当我需要将“马其顿”更改为“北马其顿”时,我是否将所有出现的“马其顿”更新为“北马其顿”?这是最佳做法吗?因为我猜在 no-sql 中你不应该有个人文件和国家文件。我对吗?
要更改国家/地区名称,您只需使用更改后的国家/地区名称更新国家/地区集合的文档。
注意:这种情况特定于一对多关系,其中多方具有非常大的数量(通常称为一对多或一对多)。另外,请注意,当“多”方的文档数量较少(在 1-N 关系中)时,设计会有所不同。