- Foxtable数据库应用开发宝典
- 贺辉 周菁
- 5195字
- 2021-03-29 01:26:57
1.2 创建数据表结构
虽然Foxtable在外观上和Excel非常相似,但本质上是完全不同的:Excel是电子表格,而Foxtable则使用数据库。
以数值“2018年12月1日”为例,由于Excel并没有严格的数据类型限制,在表格中可能输入“20181201”,也可能输入“2018121”“12/01/2018”或者“18121”,甚至直接是英文或汉字,这就会给后期的数据处理带来很大的麻烦。为提升数据输入的准确率,Excel数据管理员一般会通过设置公式等方法来限定数据的有效性(Excel 2013以后的版本称为“数据验证”)。尽管如此,往往还是会出现“百密一疏”的情况,到最后出统计报表时仍然避免不了再走一遍“数据规范化”的流程。
而Foxtable采用的数据库管理方式,其最大特点就是规范化。比如,日期列就只能输入日期格式的数据,数值列只能输入数值,字符列只能输入字符串……,既然如此,当使用Foxtable来管理数据时,首先就应该创建数据表结构,并给相应的列指定数据类型。
现以Excel下图所示数据表为例,看看它们在Foxtable中是怎样进行管理的。
1.2.1 创建表结构的4种方法
要在Foxtable中创建一个新的表结构是很简单的,常用以下4种方法。
❶在新建项目时创建或修改表结构
单击【文件】中的【新建】命令按钮,可在“创建项目”对话框中创建表,如下图所示。
其中,“表A”“表B”“表C”是Foxtable自动生成的3个数据表,每个表的列数默认为10。在这个对话框中,既可以通过单击【增加表】【删除表】或【重命名】按钮对表进行管理(比如仅保留“表A”并将其重命名为“订单”),也可以单击【上移行】或【下移行】按钮调整选定表的列顺序,单击【删除行】按钮将不需要的列删除。如果要设置的列数量大于10,可以将光标定位在最后一行的尾部,按“Enter”键或按“↓”键即可自动增加一列;如要修改指定行上的“列名”“长度”或“标题”,只需在相应单元格上双击,列类型的可选择项则有10个。
请注意,这里的“列名”不能以数字开头,更不能全是数字,也不能包括空格和各种符号(但可以使用下划线);“列标题”则没有任何限制,只要你觉得能准确地表达出语义就好。而且,“列标题”是可选的,当标题省略时,将自动以列名称作为标题在表格中显示。
由于Foxtable兼有办公软件和开发平台两种功能,当需要使用Foxtable开发自己的管理系统时,建议将“列名”设置为具有一定语义的英文单词或是简洁的中文。即便使用中文作为列名,也要注意简洁,因为这样更便于后期编写程序代码。
例如,有个用于保存客户名称的列,可以将列名设为拼音的简称“kh”,也可以设置为英文“custom”,而列标题可设为“客户”,这样在后期的程序编码中将直接使用“kh”或“custom”,但用户看到的列标题仍然是很容易理解的“客户”。当然,为了后期项目维护的方便,尽量还是不要使用太过简洁的列名,如“kh”之类的。事实上,对于习惯于Office办公软件的用户来说,直接使用简洁的中文名称也是不错的选择。
当后期需要修改标题时,比如觉得用“客户名称”可能更为合适,那么只需将列标题改为“客户名称”即可,原来编写的程序代码无需作任何修改,因为列名并没有发生变化,标题的修改不会对系统的正常运行产生任何影响。
❷在当前项目中创建表结构
如果用户希望直接在当前打开的项目中创建新表,可通过【数据表】功能区的【表相关】功能组进行操作,如下图所示。
很显然,所有涉及当前项目数据表的增加、删除、重命名、复制、移动等操作,都集中在这个功能区中。单击【增加表】按钮,系统将弹出下图所示的增加表对话框。
默认情况下,Foxtable在增加表时会自动生成10个列字段,可以根据需要对其进行修改。具体操作方法与新建项目时的修改表结构相同。
表结构设置完毕,单击【确定】按钮,还将弹出表名及表标题的设置对话框,如下图所示。
关于表名和表标题的输入规则与“列名”“列标题”完全相同。
在新表创建之后,如果不再需要系统自动生成的“表A”“表B”和“表C”,可分别选中它们,然后单击【删除表】按钮予以删除。删除表时一定要慎重,因为这种操作是不可逆的,如下图所示。
选择表时,既可使用鼠标单击表标题的方法,也可单击表标题所在位置右侧的下拉箭头,在弹出的下拉列表框中进行选择(这在项目中存在很多表时会非常方便)。
❸在当前项目中以修改表结构的方式创建表
如果不喜欢上述两种创建表的方式,也可以在Foxtable默认生成的3个表的基础上直接修改,当表数量不够时再单击【增加表】按钮添加。
假如希望修改“表A”的结构,可先选中该表,然后单击【数据表】功能区的【表相关】功能组中的【其他】按钮,如下图所示。
这是下拉菜单按钮,执行【查看表结构】命令。如要修改第一列,只需在相应的行上双击,即可弹出“更改列-第一列”对话框,这样就可以修改“第一列”的相关设置。如下图所示。
假如将“表A”修改为处理订单数据的表结构,那么还应该给该表重新设置一个更具语义的表名。单击菜单【数据表】→【表相关】中的【重命名】命令按钮,在打开的对话框中进行设置,如下图所示。
关于表名和表标题的重命名规则与“列名”“列标题”完全相同。
❹在当前项目中以复制方式创建表
如果要创建的表结构和现有的表大同小异,可以采用“复制表”的方式创建新表。【复制表】按钮在功能区【数据表】→【表相关】的【其他】下拉菜单中,如下图所示。
假如要在“订单”表的基础上创建一个结构基本雷同的新表,可以先选中“订单”表,然后单击【复制表】按钮,如下图所示。
如果选中“仅复制结构”单选钮,那么将自动创建一个结构完全相同的空表,后续再对该复制后的表稍作修改即可。复制表时,也可以选择连同表中的数据一起复制。关于复制条件方面的知识,可参考14节。
1.2.2 数据表的列类型
在Foxtable中,数据表的列类型共有四大类、10小类,如下表所示。
由上表可以看出,数值型列共有6种,除了整数和小数的差别外,主要是范围和精度的差别:范围越大,精度(有效数字)越高,那么占据的存储空间就越大,处理速度也就越慢。特别是高精度小数,除非确有需要;否则不要选用。那么究竟怎么选择呢?有个简单的方法:没有小数的列选择整数型,有小数的列选择双精度小数型,这会符合绝大多数场合的需要。唯一需要注意的是,整数的范围并不大,在−2147483648~2147483647之间,如超出此范围,可用双精度小数代替。
小数的有效数字是指从左边第一个不是0的数字算起,直到最后一个数字,就是一个数值的有效数字。例如,1324的有效数字是4位(1、3、2、4),13240的有效数字是5位(1、3、2、4、0),而0024的有效数字是两位(2、4)。明白了有效数字的概念,有助于选择合理的小数类型。例如,对于订单表中的折扣列,范围在0~1之间,精度通常不会超过3个有效数字,那么选用单精度类型完全符合要求。
现以订单表为例,假如采用之前所介绍的第二种方法来创建表,应当把“产品ID”“客户ID”设置为字符型,长度为3;“单价”和“折扣”设置为单精度小数,“数量”设置为短整数,“日期”设置为日期时间型,如下图所示。
由于“订单”表只有6列,而Foxtable默认生成的表有10列,后面多余的4列可以单击【删除行】按钮予以删除。修改后的“订单”表结构如下图所示。
同理,根据Excel中另外两个数据表“产品”“客户”的数据内容,再分别添加两个表,即“产品”和“客户”表,如下图所示。
在数据表全部创建完成后,如果需要调整它们的位置,可在【数据表】功能区的【表相关】功能组中单击【左移表】按钮,将当前选中的数据表向左移动,单击【右移表】按钮可向右移动。除了菜单方式外,也可以通过拖动的方式来移动表。例如,要将“订单”表移动到“客户”表的后面,可以用鼠标选择“订单”表后按住鼠标左键不放,然后向右拖动到合适位置释放鼠标即可。
1.2.3 快速修改表结构
在实际工作中,如果仅仅只是对指定表的某个列进行处理,可直接单击【数据表】功能区的【列相关】功能组中的相关命令按钮进行快速操作,如下图所示。
例如,单击【增加列】按钮将在当前表的最后位置添加一列,单击【插入列】按钮将在当前光标所在列的前面插入一列,单击【更改列】按钮可重新设置当前光标所在列的表名、表标题及数据类型和长度,单击【删除列】按钮可删除当前光标所在列,单击【左移列】和【右移列】按钮可将当前光标所在列进行左移和右移。
至于列相关的其他操作,如【表达式】【重置列】【列属性】等,后面还将有专门讲解。
1.2.4 关于表结构需要注意的几个问题
❶不要忘记设置主键
对于数据管理来说,主键是一个非常重要的概念。
我们每个人都有一个身份证号码,每个身份证号码都是唯一的,在正常情况下,不会再有其他人的身份证号码与你相同,这个号码就是我们的“身份标识”,是社会生活能有序进行的基础。
同样,数据表中的每一行记录都应该有一个主键值,这个主键值都是唯一的。不同的行其主键值绝对不会相同,所以行的主键值类似人的身份证号码,是行的“身份标识”,是数据管理能有序进行的基础。因此,在创建表时应该指定一列用于存储行的主键值,这一列就是主键列。
可能有的读者会问,之前在创建数据表时并没有设置主键的选项啊,那怎么处理?事实上,凡是通过Foxtable创建的数据表,都会自动生成一个名为“_Identify”的列,这就是主键列,每增加一行,该列的值就会自动在上一行的基础上加1,所以对于每一行来说,“_Identify”列的值都不会相同,是有效的“身份标识”。
出于安全考虑,凡是命名为“_Identify”的列,在修改表结构时都会被自动隐藏,以免用户误操作;由于该列仅用于数据行标识,日常操作中很少会用到,因而在显示的数据表中同样会被隐藏。
❷列名称最好使用有意义的英文单词或简洁的汉字,一旦设置就不要随便修改
列名、列标题的设置规则与表名、表标题完全一致。
如果担心这样的列名在数据展示时不够直观,可以在创建表时给每个列设置列标题。列标题是列名更具描述性的表示,没有任何书写规则上的限制。
❸对于复杂层次关系的列可使用多层表头
要实现多层表头的效果,只需在列名称或者列标题中包含下划线“_”即可。当然,最好是在列标题中使用下划线,如下图所示。
其中,东部用east中的e表示,西部用west中的w表示,季度用q表示,列标题用下划线进行分层。显示效果如下图所示。
❹谨慎使用标志列
Foxtable有两个专门的标志列名称:一个是“_Locked”,这是一个逻辑类型的列,用于标识数据行的锁定状态;另一个是“_Sort Key”,这是一个高精度的小数列,用于标识数据行在表中的显示位置,以实现数据插入功能。这两个标志列和主键“_Identify”列一样,在修改表结构或显示数据表时都是自动隐藏的。
● 锁定标志列:_Locked
正常情况下,对任何一个数据表的数据行,随时都可锁定,锁定后的数据行不能再修改。如果这个表在创建时没有添加“_Locked”列,则在项目退出后重新进入时,那些锁定的行会自动解锁,仍然可以编辑。这是因为数据表没有办法记录当时的锁定状态。
如要永久记录数据行的锁定状态,只需在对应的数据表结构上增加一个列“_Locked”。
● 插入标志列:_Sort Key
由于数据库本身并不存在记录插入这样的说法,每一条新增加的记录都是按顺序添加到数据表的最后一行。但在实际工作中,有时又会用到这样的功能:比如,公司已经输入了全部的人员名单,这个名单是按照职务高低顺序输入的;后来公司新来一位领导,按职位属于公司第二把手,这就需要输入到第二个人的前面,此时插入功能就派上用场了。
为实现这样的插入功能,就必须在对应的数据表结构上增加一个列“_Sort Key”。说白了,这种插入也是变通方法实现的,它在数据库中仍然排在最后一行,只不过在显示数据时按“_Sort Key”排序罢了。
很明显,为了实现上述两个功能,数据表上都要单独增加相应的标志列。如果数据量非常大,可能就会占用比较多的资源。因此,除非非常有必要;否则就不要使用这样的标志列。
默认情况下,凡通过Foxtable创建的数据表都会自动增加上述两个标志列。如果想在数据表中取消这样的功能,可单击【数据表】→【表相关】→【设置标志列】命令按钮,然后根据需要选择需要开启的功能,如下图所示。
上图中取消了“客户”表的“插入行标志列”的勾选,单击【确定】按钮后,该表中的“_Sort Key”列将被删除,那么以后在“客户”表中编辑数据时就不能再使用“插入行”的功能;同样地,如果将“产品”表的“锁定行标志列”取消勾选,那么该表的“_Locked”列也会被删除,日常操作时即使在该表中锁定了某个数据行,但在项目文件重启后仍然会失效。
取消后当然也可以再加上。例如,再次勾选“客户”表的“插入行标志列”复选框,单击【确定】按钮后就会在该表中重新加上“_Sort Key”列,插入行功能生效。添加“_Locked”列的方法同理。
尽管标志列的设定看起来非常方便,但在使用时仍然要慎重。一旦设置就不要再轻易修改,尤其是在有大量数据时。
❺自动隐藏列
综上所述,Foxtable提供了3个专用的列名,即_Identify、_Locked、_Sort Key,这3个列名默认情况下都是隐藏的,对普通用户是不可见的。
在创建数据表时,如果将列名以“sys_”开头,则该列同样会被自动隐藏,如sys_标记。
需要注意的是,这种隐藏仅仅是针对非开发者而言的。对于开发者来说,以字符“sys_”开头的系统列,和普通列无异,仍然可以显示,也可以对其进行更改(初次打开Foxtable时默认都是使用开发者身份。至于开发者和非开发者的区别第3章将有讲述)。