开发者社区> 科技探索者> 正文

走近复杂数据库计算型软件的设计与制作(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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19361 0
软件设计师之计算机组成原理与体系结构(2)
软件设计师之计算机组成原理与体系结构(2)
25 0
软件设计师之计算机组成原理与体系结构(4)存储系统
软件设计师之计算机组成原理与体系结构(4)存储系统
29 0
计算机软件著作权申请流程是什么?需要准备哪些材料?怎么办理?
计算机软件著作权申请流程是什么?需要准备哪些材料?怎么办理? 计算机软件著作权申请流程是什么? 软件著作权申请流程:搜索“中国版权保护中心官网”(如下图) 申请账户注册登录,进入账户中心,点击“我要登记”,然后填写申请表——提交申请文件——登记机构受理申请——审查——获得登记证书 软件著作.
1056 0
软件设计师之计算机组成原理与体系结构(3)流水线技术(重要)
软件设计师之计算机组成原理与体系结构(3)流水线技术(重要)
35 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24389 0
【转】MySQL数据库复制表名映射方案及扩展应用
转自:http://www.mysqlops.com/2012/06/20/mysql%E8%A1%A8%E5%90%8D%E6%98%A0%E5%B0%84%E6%96%B9%E6%A1%88%E5%8F%8A%E6%89%A9%E5%B1%95%E5%BA%94%E7%94%A8.html这篇文章介绍的简单方案应用于如下需求:主库为了性能考虑,作分库分表,从库则上为了多索引查询等需求,不作分表。
889 0
5488
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载