走近复杂数据库计算型软件的设计与制作(2)—数据表的设计

简介:
摘要:接着昨天的数据库的数据类型定义和默认值设计,今天叙述数据表的设计。
昨天叙述了数据库的数据类型定义和默认值设计,由于业务规则的复杂性和商业上机密性,笔者不方便讲述需要定义的表的原因。只是在建表的过程中使用了定义的数据类型。数据表的定义不是很复杂,使用自定义的数据类型代替定义列的原始数据类型就可以了。在设计的过程中有一些需要思考斟酌的东西,就是数据表之间的关系,下面着重讲解一下几个重要的表。
       会员注册的时候有一个会员信息表,他们的登陆信息需要保存在一个表中还是两个表中,如果是两个表, 比如member表保存基本信息,login表保存登陆信息,这两个表应该是一对一的关系。笔者在设计的过程中把会员的基本信息比如身份证,会员姓名等放在一起,把登陆信息放在另外的表中。理由有21.登陆表小,方便查询优化,2,为了应付以后可能的新的需求,比如要增加一个登陆信息,转到一个特定的能执行SQL的管理页面,就没有必要添加登陆对应的会员基本信息。实践证明这样是正确的,因为经常需要维护系统的数据,比如修改一些使用界面不能修改的东西,就可以使用这样的登陆来执行。下面是会员表的设计
       create table member(
m_id                                   D_M_ID,
name                                   D_NAME,
sex                                     D_SEX,
country                        D_NAME,
province                D_NAME,
city                              D_NAME,
bank_name                   D_name,
bank_card                    D_BANKCARD,
bank_city                     D_name,
bank_site               D_ADDRESS,
ID_CARD                           D_IDCARD,
mobile_phone  D_PHONE,
phone                                  D_PHONE,
E_MAIL                       D_EMAIL,
zip                                      D_ZIP,
address                        D_ADDRESS,
user_level              D_TINY,
regDate                        D_REGDATE,
constraint pk_member primary key(m_id),
)
go
另外一个就是奖金的信息表,奖金的种类有三十多种,对应每种奖金都建立一个表的话可能需要三十多个表,经过研究发现,奖金中有一些共同的特征,比如有ID号码,期数等,把这些信息可以综合在一个表中,使用一个奖金类型的列来进行区分,这样的话就需要两张表,一张表用于记录奖金所有的种类信息,另外的一张表用来记录奖金的具体信息。在查看个人奖金的时候可以使用视图来区分,以下就是 这两张表的设计,
create table award_about(
award_type                          int,
award_num                                int,
description             varchar(100),
constraint pk_award_about primary key(award_type)
)
go
 
-----------------------award_level------------------
 
create table award_level(
al_id                      int identity(1,1),
m_ID                           D_M_ID,
turns                            D_TINY,
c_times                        D_TINY,
rm_id                           D_M_ID,
level                      D_TINY,
award_type     D_TINY,
amount                  D_TINY,
money                          D_INT,
enabled                  D_BIT,
primary key(al_id)
)
Go
由于系统需要在每次结算的时候进行数据备份,如果计算错误的话,需要进行回退,这样就使得一部分表在每次结算之前必须存放在另外的一张表中,称之为软备份。系统需要设置一个保存点,这个保存点其实是一张表,里面记录了当前系统的一些全局的信息,比如当前所在的期。这个表需要在每次计算的时候进行备份,系统恢复的时候首先恢复这个表,然后根据这个表的信息恢复所有其他表的信息。这个表需要始终保持只有一行。
 
create table misc(
turns                                                 int default 1,
head                                           int default 1,
tail                                             int default 1,
leave_coins                          D_INT,
new_coins                                  D_INT,
consume_coins                    D_INT,
c_times                                      tinyint default 1,
max_level                                   D_TINY,
 
deposition                            D_TINY,
locked                                        D_BIT,
)
Go
历史纪录保存在下面的表中
create table misc_history(
turns                                                 int default 1,
c_times                                      tinyint default 1,
head                                           int default 1,
tail                                             int default 1,
leave_coins                          int,
new_coins                                  int,
old_coins                             D_INT,
new_shops                                 D_INT,
consume_coins                    D_INT,
max_level                                   D_TINY,
deposition                            D_TINY,
locked                                        D_BIT,
regdate                                       D_REGDATE,
constraint pk_misc_his primary key(turns,c_times)
)
Go
还有一个比较复杂的表就是有着父子关系的树状表,其中的一个列代表了父节点的ID,在此就不多说了,不完整的表示如下:
create table stock(
s_id                             D_INT identity(1,1),
ps_ID                                 D_INT,
)
Go
整个数据库表的设计需要不断的调整,直到满足所有的业务需求之后才能最终定下来。定下来的时间越早越好,有经验的数据库设计师可以预测到可能的变化,然后作出相应的机动设置信息。这种经验是可贵的,需要不断的实践才能获得,绝非一朝一夕能学到的。
今天就先到这里,明天接着讲述数据视图的设计,如果你能学到一些东西或者指出笔者的一些不足之处,笔者会十分高兴。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/42190如需转载请自行联系原作者

lili00okok
相关文章
|
3天前
|
存储 负载均衡 容灾
软件体系结构 - 关系数据库(4)分区
【4月更文挑战第27天】软件体系结构 - 关系数据库(4)分区
24 1
|
3天前
|
运维 负载均衡 监控
软件体系结构 - 关系数据库(3)主从架构
【4月更文挑战第26天】软件体系结构 - 关系数据库(3)主从架构
30 0
|
3天前
|
存储 SQL 缓存
软件体系结构 - 关系数据库(2)反规范化
【4月更文挑战第25天】软件体系结构 - 关系数据库(2)反规范化
22 1
|
3天前
|
存储 数据库
软件体系结构 - 关系数据库(1)规范化
【4月更文挑战第24天】软件体系结构 - 关系数据库(1)规范化
27 0
|
3天前
|
存储 SQL 数据库
软件体系结构 - 架构风格(10)数据库系统架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(10)数据库系统架构风格
37 0
|
3天前
|
存储 SQL Java
软件体系结构 - 嵌入式系统(3)- 嵌入式数据库
软件体系结构 - 嵌入式系统(3)- 嵌入式数据库
18 0
|
3天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
105 0
|
3天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
23 0
|
3天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
12 0
|
3天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
16 0