none
数据库设计问题 RRS feed

  • 问题

  • 在开发的时候,由于客户需求的变化,或其他原因,数据库经常要变动,比如增加一些新表一些新字段等。
    随着数据库的改变,程序也要做相当的改变。
    请问下,该如何设计数据库,才能尽量减少程序的改动。
    或应该如何写程序,尽量减少数据库变动带来的影响呢?

    2009年10月5日 13:28

答案

  • 你好!
         可以采用目前流行的三层架构来设计你的系统,增加数据访问层,把访问数据的代码抽象出来,尽量减少业务层代码的改动!
    周雪峰
    2009年10月6日 1:59
    版主

全部回复

  • http://www.china-pub.com/34210&ref=browse 介绍入门设计数据库书
    一两句话解决不了什么问题 最好打下基础
    2009年10月5日 13:32
  • 你好!
         可以采用目前流行的三层架构来设计你的系统,增加数据访问层,把访问数据的代码抽象出来,尽量减少业务层代码的改动!
    周雪峰
    2009年10月6日 1:59
    版主
  • 我的感觉,越是分层多,一旦数据库改动,越要修改的多啊。
    我现在的做法是,设计表的时候,在可能增加字段的表,预留2,3个字段。
    不过这是比较笨的做法。
    不知大家还有什么好的经验。
    2009年10月6日 4:48
  • 我的感觉,越是分层多,一旦数据库改动,越要修改的多啊。
    我现在的做法是,设计表的时候,在可能增加字段的表,预留2,3个字段。
    不过这是比较笨的做法。
    不知大家还有什么好的经验。
    那应该是你的层次划分和抽象的方法有一定的问题啊!这样的设计需要有经验的架构师来设计,如果设计的不合理,的确会出现你说的情况!
    预留字段不是一个好主意,可能会带来更多的麻烦,不建议你这样做!

    周雪峰
    2009年10月6日 6:35
    版主
  • 我的感觉,越是分层多,一旦数据库改动,越要修改的多啊。
    我现在的做法是,设计表的时候,在可能增加字段的表,预留2,3个字段。
    不过这是比较笨的做法。
    不知大家还有什么好的经验。
    那应该是你的层次划分和抽象的方法有一定的问题啊!这样的设计需要有经验的架构师来设计,如果设计的不合理,的确会出现你说的情况!
    预留字段不是一个好主意,可能会带来更多的麻烦,不建议你这样做!

    周雪峰

    除了上面的那本书,您能给介绍一本这方面的书吗?
    做最好的自己
    2009年10月6日 7:40
  • 可以看看这本书:
    http://www.amazon.com/Server-2005-Database-Design-Optimization/dp/1590595297/ref=sr_1_3?ie=UTF8&s=books&qid=1254817097&sr=8-3
    周雪峰
    2009年10月6日 8:18
    版主
  • 比如,增加一个字段,
    实体类首先要改了。
    其次,DAL里的基本方法,添加,修改,选择的方法也要相应的改(用 select * 的话,选择方法就不用改)
    这些变动还是最基本的。
    如果你的BLL层的某些方法涉及到你新建的字段,那么BLL里对应的函数方法也要改。
    这样不是很麻烦吗。
    我的希望是,增加了字段,可以不改原来的程序。
    通过继承也好,其他什么也好,只需增加一些新的代码。
    因为有时改会改的头晕。容易出错。
    所以我觉得最根本是数据库的设计,如何设计,才能在变动时,减少对已有程序的影响。

    2009年10月6日 12:39
  • 比如,增加一个字段,
    实体类首先要改了。
    其次,DAL里的基本方法,添加,修改,选择的方法也要相应的改(用 select * 的话,选择方法就不用改)
    这些变动还是最基本的。
    如果你的BLL层的某些方法涉及到你新建的字段,那么BLL里对应的函数方法也要改。
    这样不是很麻烦吗。
    我的希望是,增加了字段,可以不改原来的程序。
    通过继承也好,其他什么也好,只需增加一些新的代码。
    因为有时改会改的头晕。容易出错。
    所以我觉得最根本是数据库的设计,如何设计,才能在变动时,减少对已有程序的影响。

    一句话 想法是美好的 现实是残酷的 
    谁也预料不了未来
    2009年10月6日 13:18
  • 可以看看这本书:
    http://www.amazon.com/Server-2005-Database-Design-Optimization/dp/1590595297/ref=sr_1_3?ie=UTF8&s=books&qid=1254817097&sr=8-3
    周雪峰

    谢谢。
    做最好的自己
    2009年10月7日 3:30
  • 朋友,你好
    这正是动态程序嵌入动态数据库的关键所在,这部分应该在软件开发的第一阶段“用户需求调查”完成的。这才是软件开发的全部过程中的最关键的阶段。能否说明使用的是哪个数据库平台吗?
    Smile service,common progress!
    2009年10月7日 11:00
  • 朋友,你好
    这正是动态程序嵌入动态数据库的关键所在,这部分应该在软件开发的第一阶段“用户需求调查”完成的。这才是软件开发的全部过程中的最关键的阶段。能否说明使用的是哪个数据库平台吗?
    Smile service,common progress!

    这个与数据库有关吗?请指教。一般是用sqlserver
    2009年10月8日 4:03
  • 朋友,你好
    这正是动态程序嵌入动态数据库的关键所在,这部分应该在软件开发的第一阶段“用户需求调查”完成的。这才是软件开发的全部过程中的最关键的阶段。能否说明使用的是哪个数据库平台吗?
    Smile service,common progress!

    这个与数据库有关吗?请指教。一般是用sqlserver

    朋友,您好
    当然有关系了。因为平台与平台的存储原理是不同的。下面我将从具体问题着手。在SQL Server上建立200M与400M的数据库设备Device_1、Device_2,在Device_1与Device_2上分别建立容量为100M的两个数据库Db1与Db2,在Db1库中建立表T_1,有四个域:Name,Age,Sex,ID_Code,以ID_Code为关键字,以Name为索引,在Db2库中建立表T_2,有五个域:Name、Age、Sex、Department、No,以Department与No为关键字。

    访问SQL Server,首先要打开SQL Service Manager,SQL Service Manager 用于启动、暂停、继续、停止SQL Server的服务,包括MSSQLServer与SQLExecutive两项。可以通过手工方式打开这两项服务,也可以在程序中通过行命令式打开它们。

    若采用手工方式,则打开SQL Service Manager,对于其中的服务MSSQLServer与SQLExecutive,直接启动它们的Start/Continue绿灯即可。

    采用行命令启动方式,可利用VB的Shell命令:  

    X=shell("Sqlmgr.exe",1) 显示SQL Service Manager窗口;

    X=shell("net start mssqlserver") 启动MSSQLServer服务

    X=shell("net start sqlexecutive") 启动SQLExecutive服务

    因为在这里我们希望通过编程在SQL Server上实现数据对象结构的动态建立,因此建议使用行命令方式。

    启动了SQL Server Manager后,我们就可以利用DMO与Transact-SQL按以下步骤来建数据对象了。

    1.为能使用DMO,首先需要打开VB工具栏中Reference(引用),选择Microsoft Windows Common Control 5.0,如果在引用栏中没有发现此项,则选择Browse(浏览),将\WINNT\System32目录下的Comctl32.oca加入到Reference中来。

    2.在模块文件(.BAS)中建立SQLOLE对象:

    Global OServer as New SQLOLE.SQLServer

    3.建立与SQL Server的连接:  

    OServer.Connect ServerName:=注册的SQL Server名,Login:=登录名(一般为sa),Password:=密码

    4.建数据库设备Device_1与Device_2: 

    dim transql as string

    transql="use master" & _

    "DISK INIT" & _

    "Name='Device_1'," & _

    "Physname='D:\SQL\data\device1.dat'," & _

    "vdevno=10," & _

    "size=102400" & _

    "DISK INIT" & _

    "Name='Device2'," & _

    "Physname='D:\SQL\data\device2.dat'," & _

    "vdevno=11," & _

    "size=204800"

    OServer.ExecuteImmediate Command:=transql,exectype:=SQLOLEExec_Default

    5.建数据库Db_1与Db_2:

    transql = "CREATE DATABASE Db_1 ON Device_1=100 "

    OServer.ExecuteImmediate Command:=transql, exectype:=SQLOLEExec_Default

    transql = "CREATE DATABASE Db_2 ON Device_2=100 "

    OServer.ExecuteImmediate Command:=transql, exectype:=SQLOLEExec_Default

    6.在数据库中建表:

    在数据库Db_1上建表T_1:  

    transql = "use Db_1 " & _

    create table T_1 " & _

    "(Name char(8) null, " & _

    " Age numeric(2) null, " & _

    " Sex smallint null, " & _

    " ID_Code char(16) not null, " & _

    " constraint c_1 primary key clustered (ID_Code))"

    OServer.ExecuteImmediate Command:=transql,exectype:=SQLOLEExec_Default

    建表T_1的Name列的索引:  

    transql="CREATE INDEX index_1 ON T_1 (Name)"

    OServer.ExecuteImmediate Command:=transql,exectype:=SQLOLEExec_Default

    在数据库Db_2上建表T_2:

    transql = "use Db_2 " & _

    "create table T_2 " & _

    "(Name char(8) null, " & _

    " Age numeric(2) null, " & _

    " Sex smallint null, " & _

    " Department char(16) not nill, " & _

    " No char(4) not null," & _

    "constraint c_2 primary key clustered (Department,No))"

    OServer.ExecuteImmediate Command:=transql, exectype:=SQLOLEExec_Default

    此时,我们完成了建立数据对象的编码工作,程序被编译执行后,就会在SQL Server上自动建立数据库设备、数据库及库中的表。

    对于数据库设备,可以用DISK REINIT,DISK REFIT,DISK RESIZE对它进行操作,如要扩展数据库设备Device_1的容量为200M,可利用如下方法:

    DISK RESIZE

    Name='Devive_1',

    Size = 102400

    对于SQL Server上已经建立的数据库及表的结构,也可以通过DMO与事务SQL进行修改与删除。类似于上面的编码,可以利用Alter Database Db_1,Alter DatabaseDb_2,Alter Table T_1,Alter Table T_2等事务SQL语句进行对所建立的数据库与表的的结构进行修改,而利用Drop Database, Drop Table事务语句删除所建立的数据库与表。


    Smile service,common progress!
    2009年10月8日 5:10