走近复杂数据库计算型软件的设计与制作(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
上一篇:Windows下GIt入门试验配置教程单机版


下一篇:Hologres如何支持超高基数UV计算(基于roaringbitmap实现)