Skip to content

Directus

Directus 是一个Open Source的数据引擎。为SQL数据库提供开箱即用的REST GRAPH QL API以及数据管理APP。

1. Collection

一个Collection对应数据库的一张表。directus的collection里面有一些独有的概念,例如alias域, sort属性等。

1.1. alias

Fields that do not map directly to an actual database column are called "alias" fields. For example, presentation fields (such as dividers and groups) and certain relational types that display data stored elsewhere (such as One-to-Many (O2M) and Many-to-Many (M2M)).

O2M, M2M, M2A 等,都不会在表里面有实际的列。称其为alias域。

picture 6

alias虽然在实际数据库表里面没有列,但是在direct_fields表里面有记录。例如上面pages集合的element域,是m2a类型的alias。

direct_collections表里面描述系统所有受directus管理的表,direct_fields里面描述所有表的所有属性。 通过这种非侵入的方式, 数据库中原有的表结构可以不做改动。

1.2. sort 属性

如果collection建立时候,选择了支持sort,表里面就会多一个sort列。 这一列的作用是支持在app上手工拖拽的方式调整记录的顺序。 原理很简单,表里面加了一个number类型的sort列, 当拖拽的时候,会导致该列的值根据记录的位置产生变动。

1.3. share

APP的一个功能, 可以把模型中的一个记录生成一个链接,发送给其它人只读访问。 可以设置密码,有效期,以哪一个身份读取等。

picture 8

在数据库中,directus有特定的表,directus_shares来管理所有的share。 picture 9

2. Relationship

表和表之间的关系。 directus支持下面四种。

2.1. M2M

通过中间表实现多对对关系。 例如Product 和 Tag 之间。

2.2. O2M

一对多关系, 例如order和order row之间。 在order row模型中需要有外键,来确定该order row是属于哪一个order的。可以在order row中加一个外键order,其取值为orders表中的id。

2.3. M2O

和O2M一样,只是从order row看order。

2.4. M2A

和M2M类似, 区别是可以表现一个集合对多个集合的关系。在juntion表里面,除了存id之外,还存了集合名称。比如一个Page可能包括header,footer,section几种元素。 下面的juntion表,表示page id为1的页面,包括了id为1的footer,id为1的header和id为2的section。

picture 4

使用M2A关系,在APP上可以方便的添加不同的item到page里面。 这种关系也被称为replicator(复制器)。

如果把上图中的collection列去掉,M2A就退化成M2M关系了。 只能表示两个特定集合之间的关系。

M2A是Many to Any的缩写。之所以叫any是因为关系表里面存了集合名字和id,所以理论上是可以表示任何集合的任何元素。

3. 国际化方案

3.1. 模型名称和属性名称的多语言

模型的名称可以多语言。 通过模型配置里面添加“Collection Name Translations”。

模型的属性名称可以多语言。通过配置模型/Field/Field Name Transalation。

picture 7

模型名称和属性名称的多语言数据在数据库里面都是用JSON字符串存储。所有语言的翻译放在一起。

3.2. 记录内容的多语言

模型内的元素内容可以做多语音,通过多语言collection实现。其原理是把所有需要多语言支持的属性放到一个多语言表里面。这个表里面有所有需要多语言翻译的列, 以及一个语言code列(取值zh-CN,en-US等),这样对所有原模型中的行,会对应翻译模型里面中文一行,英文一行。来存放翻译好的数据。 https://docs.directus.io/configuration/data-model/#creating-translated-multilingual-fields

编辑Langues模型中的数据,只留下中英语,则在APP上只会展示中英文翻译。

picture 5

如上图, product集合有三个列需要多语言支持,分别是description,longtext和pic。 从图中可见,图片也支持多语言(不同语言使用不同图片)。

一般我们实现多语言最直观的想法就是在表里面加列,中文一列,英文一列,西班牙语一列。这样后续增加新语言要改表结构,扩展性不好。 Directus这种实现方法扩展性更好,一种结构支持所有语言。