Grayson.Shang 发表于 2023-11-3 12:15:47

看完必恍然大悟的活字格内幕:七十二、外联库的用户字段类型的原理到底是什么

本帖最后由 Grayson.Shang 于 2023-11-3 13:49 编辑

无论是刚开始接触活字格开发的新格友,还是使用很长时间成为活字格论坛大佬的老格友们,在设计数据表的时候,应该都有接触过用户类型的这个字段。

若是打开对活字格使用的久一些的话,应该会有这样的疑问,创建在内建表的用户字段,可以自动关联出用户信息视图中的其他字段信息,比如全名、角色等

那创建在外联库中的数据表使用用户字段的时候,为什么这个功能还是可以正常使用呢?到底是个什么原理呢?今天来为大家做一个解密。


先描述一下功能的使用,以及对应的特性

1. 活字格在创建数据表的时候,有一个字段类型是用户类型,而用户类型的字段,不只是可以创建在内建库中,也同样可以创建在外联库中
2. 但是用户的用户信息视图一定是存储在内建库中,即使发布之后,将用户数据库切换到外联库,用户信息视图也不会迁移
3. 即使是创建在外联库中的用户字段,也同样可以关联出对应的其他自定义字段,包括但不限于,全名、角色、和邮箱

4. 而且在页面上关联展示的时候,也可以将用户的这些属性展示出来,帖子后面也会通过“正使用用户字段”真来指代这种使用



前面说的其实都是现象,接下来我大致解释一下原理
1、 众所周知,跨不同的数据库关联,除非有特殊的工具处理,一般都是做不到的,而特殊的工具如何处理,咱们今天不做讨论,那活字格实现了类似的功能,可以看看活字格是如何处理的
2、 看看用户类型的字段在外联库中是如何存储的,下面以SQL Server举例,会发现用户字段在数据库中存储的类型和文本类型是一样的


3、 其实在创建表时,使用用户字段的类型,活字格其实并没有做任何事情,因为在这期间,虽然创建了,但是没有当成用户字段来使用,其实和正常的文本类型没有什么区别
4、 真正的区别是在页面上将用户类型的字段,当用户类型的字段来使用时,将人话,就是将你当这个字段当成用户字段使用时,那他就与文本字段产生了区别,而如何将他当成用户类型字段来使用呢?
5、 具体可以参考下面的动图,前半部分,是将用户字段和当成文本字段来使用,所以和文本字段没有区别,后半部分就是将他真正当成用户字段来使用了

6、 那活字格对于这样可以正常使用做了什么?答案的揭晓其实就在外联库中,我们不能跨库关联,但是我们可以做到同库关联,所以我们只要将用户信息视图的数据同步到外联库中,那就不存在这个问题了,所以活字格就做了这样的工作,在外联库创建表


7、 再说一下这个机制中的一些时机

[*]表创建时机:只有在页面上,真正将用户当成用户字段使用的时候,才会创建
[*]表结构修改时机:初始创建这张表的时候,并不是将用户信息视图中所有的字段都创建,而是使用到哪一个字段,才会增加哪一个字段,也就是说,若是开始只是使用了用户的全名,那么这张数据表中就会只有,两个字段,用户名,以及全名,再使用其他字段,会在程序运行的时候,动态修改表格结构,增加其他字段。
[*]内容刷新时机:并不是每当程序运行,都会刷新数据表中的数据,而是程序运行起来之后,有真正使用用户字段的时候,才会刷新外联库中的表
[*]创建表个数:创建表的个数并不只是一个,也不是唯一的,和电脑有关系,有几个电脑以上面所说的方式连接就会创建几个表,也就是即使是多个电脑打开同一个活字格的工程文件,那么他们所对的表也是不一样的,下面是我使用两个电脑打开同一个工程文件的测试

[*]表名称剖析:fgc2_usd_xa_cs_grayson,其实咱们需要关注的不多,只需要注意到,后面的这个xa_cs_grayson,是计算机的机器名,其他的都是内置的使用,可以不用关心


[*]设计器与服务器:设计器既然使用明白了,而应用最后都需要发布到服务器,那服务器对于这个功能是否支持,是如何支持的呢
请看这种图,其中两个表名及其相似,其实就是一个是设计器连接数据库使用创建的表,一个是发布到设计器所在机器的服务器上所创建的表

fgc2_us:指的是服务器
fgc2_usd:指的是设计器

这样我们就可以根据这个机制,在我们平时的开发中玩出更多的花样:itwn:




页: [1]
查看完整版本: 看完必恍然大悟的活字格内幕:七十二、外联库的用户字段类型的原理到底是什么