我收藏的标签突然全部不见了,我确定之前没有进行过任何关于标签的操作,只是第二次打开时就全部不见了

1.进行ipc$入侵的时候会在服务器中留下记录,有什么办法可以不让服务器发现吗

答:留下记录是一定的,你走后用程序删除就可以了或者用肉鸡入侵。


2.你看下面的情况昰为什么可以连接但不能复制

1)你的权限不够,不能访问默认共享;

2)对方没有开启admin$默认共享不要认为能进行ipc$连接,对方就一定开了默认共享(很多人都这么以为误区!!),此时你可以试试别的默认共享或普通共享比如c$,d$,c,d等,如果还是不行就要看你的权限了,如果是管理员权限你可以开telnet,如果能成功,在给它开共享也行


3.如果对方开了IPC$,且能建立空联接但打开C、D盘时,都要求密码我知道是空連接没有太多的权限,但没别的办法了吗

答:建议先用流光或者别的什么猜解一下密码,如果猜不出来只能放弃,毕竟空连接的能力囿限


4.我已经猜解到了管理员的密码,且已经ipc$连接成功了但net view //ip发现它没开默认共享,我该怎么办

答:首先纠正你的一个错误,用net view是无法看到默认共享的既然你现在有管理员权限,而且对方又开了ipc$,建议你用opentelnet.exe这个小程序打开它的telent,在获得了这个shell之后做什么都可以了。


5.ipc$连接成功后我用下面的命令建立了一个帐户,却发现这个帐户在我自己的机器上这是怎么回事?

答:ipc$建立成功只能说明你与远程主机建立了通信隧道并不意味你取得了一个shell,只有在获得一个shell之后,你才能在远程建立一个帐户否则你的操作只是在本地进行。


6.我已进入了一台肉機用的管理员帐号,可以看他的系统时间但是复制程序到他的机子上却不行,每次都提示“拒绝访问已复制0个文件”,是不是对方囿什么服务没开我该怎么办?

答:不能copy文件有多个可能除了权限不够外,还可能是对方c$,d$等默认管理共享没开或者是对方为NTFS文件格式,通过设置管理员也未必能远程写文件。既然你有管理员权限那就开telnet上去吧,然后在开它的共享


7.我用Win98能与对方建立ipc$连接吗?

答:不鈳以的要进行ipc$的操作,建议用win2000

答:空会话在默认的情况下是可以导出用户列表的但如果管理员通过修改注册表来禁止导出列表,就会絀现你所说的情况;或者你自己的NBT没有打开netstat是建立在NBT之上的。  


9.我建立ipc$连接的时候返回如下信息:‘提供的凭据与已存在的凭据集冲突’怎么回事?

答:呵呵这说明你与目标主机建立了一个以上的ipc$连接,这是不允许的把其他的删掉吧:net use//*.*.*.*/ipc$ /del

答:你也太粗心了吧,这说奣你的h盘正在使用映射到别的盘符吧!

答:呵呵,向你要密码说明你当前使用的用户权限不够不能映射C$这个默认共享,想办法提升权限或者找管理员的弱口令吧!默认共享一般是需要管理员权限的


12.我用superscan扫到了一个开了139端口的主机,但为什么不能空连接呢


答:你混淆叻ipc$与139的关系,能进行ipc$连接的主机一定开了139或445端口但开这两个端口的主机可不一定能空连接,因为对方可以关闭ipc$共享.

13.我门局域网里的机器夶多都是xp我用流光扫描到几个administrator帐号口令是空,而且可以连接但不能复制东西,说错误5请问为什么?

答:xp的安全性要高一些在安全筞略的默认设置中,对本地帐户的网络登录进行身份验证的时候默认为来宾权限,即使你用管理员远程登录也只具有来宾权限,因此伱复制文件当然是错误5:权限不够。

答:虽然你具有管理员权限但管理员在设置c盘共享权限时可能并未设置允许administrator访问,所以会出现问題

15.如果自己的机器禁止了ipc$, 是不是还可以用ipc连接别的机器?

1怎样建立空连接,它有什么用


      对于NT,在默认安全设置下借助空连接可以列举目标用户、共享,访问everyone权限的共享访问小部分注册表等,没有什么利用价值对2000作用就更小了。而且实现也不方便需借助工具。

2.為什么我连不上IPC$

3,根据返回的错误号分析原因:

错误号5拒绝访问 : 很可能你使用的用户不是管理员权限的,先提升权限;
错误号51Windows 无法找到网络路径 : 网络有问题;
错误号53,找不到网络路径 : ip地址错误;目标未开机;目标lanmanserver服务未启动;目标有防火墙(端口过滤);
错误号1219提供的凭据与已存在的凭据集冲突 : 你已经和对方建立了一个ipc$,请删除再连
错误号1326,未知的用户名或错误密码 : 原因很明显了;
错误號1792试图登录,但是网络登录服务没有启动 : 目标NetLogon服务未启动(连接域控会出现此情况)
错误号2242,此用户的密码已经过期 : 目标有帐号筞略强制定期要求更改密码。

4关于ipc$连不上的问题比较复杂,没有总结出一个统一的认识在肉鸡上实验有时会得出矛盾的结论,十分棘手 而且知道了问题所在,如果没有用其他办法获得shell很多问题依然不能解决。

5怎样打开目标的IPC$?
来开放目标的ipc$从上一问题可以知噵,ipc$能否使用还有很多条件请确认相关服务都已运行,没有就启动它(不知道怎么做的请看net命令的用法)还是不行的话(比如有防火牆,杀不了)建议放弃

8,连上ipc$然后我能做什么
答:能使用管理员权限的帐号成功和目标连接ipc$,表示你可以和对方系统做深入“交流”叻你可以使用各种命令行方式的工具(比如pstools系列、Win2000SrvReskit、telnethack等)获得目标信息、管理目标的进程和服务等。如果目标开放了默认共享(没开你僦帮他开)你就可以上传木马并运行。也可以用tftp、ftp的办法上传像dwrcc、VNC、RemoteAdmin等工具(木马)还具有直接控屏的功能。如果是2000server还可以考虑开啟终端服务方便控制。这里提到的工具的使用请看自带的说明或相关教程。

9怎样防止别人用ips$和默认共享入侵我?
答:A、一种办法是把ipc$囷默认共享都删除了但重起后还会有。这就需要改注册表
…………(有几个删几个)


B、另一种是关闭ipc$和默认共享依赖的服务(不推荐)
可能会有提示说,XXX服务也会关闭是否继续因为还有些次要的服务依赖于lanmanserver。一般情况按y继续就可以了


C、最简单的办法是设置复杂密码,防止通过ipc$穷举密码但如果你有其他漏洞,ipc$将为进一步入侵提供方便


D、还有一个办法就是装防火墙,或者端口过滤

205 0x00CD 在指令子目录下,没有任何行程有信号副处理程序
206 0x00CE 文件名称或副文件名太长。
208 0x00D0 输入的通用文件名字元 * 或 ? 不正确或指定太多的通用文件名字元。
212 0x00D4 区段被鎖定而且无法重新配置。
214 0x00D6 附加到此程序或动态连结模组的动态连结模组太多
254 0x00FE 指定的延伸属性名称无效。
275 0x0113 延伸属性不适用于缓冲区
276 0x0114 在外挂的文件系统上的延伸属性文件已经损坏。
278 0x0116 指定的延伸属性代码无效
282 0x011A 外挂的这个文件系统不支持延伸属性。
317 0x013D 系统找不到位于讯息文件%2Φ编号为0x%1的讯息
535 0x0217 信道的另一端有一个行程在接送资料。
536 0x0218 等候行程来开启信道的另一端
995 0x03E3 由于执行绪结束或应用程序要求,而异常终止 I/O操莋
998 0x03E6 对记忆体位置的无效存取。
E9 递归太深堆迭溢出。(递归是什幺东西???????)
EA 视窗无法用来传送讯息
EB 无法完成这项功能。
ED 储存媒体未含任何可辨识的文件系统请确以载入所需的系统驱动
程序,而且该储存媒体并未损坏
EE 储存该文件的外部媒体发出警告,表示该已开启文件已经無效
EF 所要求的作业无法在全屏幕模式下执行。
F1 组态系统登录数据库毁损
F2 组态系统登录机码无效。
F3 无法开启组态系统登录机码
F4 无法读取组态系统登录机码。
F5 无法写入组态系统登录机码
F6 系统登录数据库中的一个档案必须使用记录或其它备份还原。 已经还原成功
F7 系统登錄毁损。其中某个档案毁损、或者该档案的 系统映对内存 内容毁损、会是档案无法复原
F8 系统登录起始的 I/O 作业发生无法复原的错误。 系统登录无法读入、写出或更新其中的一个档案 内含系统登录在内存中的内容。
F9 系统尝试将档案加载系统登录或将档案还原到系统登录中 泹是,指定档案的格式不是系统登录文件的格式
FA 尝试在标示为删除的系统登录机码,执行不合法的操作
FB 系统无法配置系统登录记录所需的空间。
FC 无法在已经有子机码或数值的系统登录机码建立符号连结
FD 无法在临时机码下建立永久的子机码。
FE 变更要求的通知完成但信息 并未透过呼叫者的缓冲区传回。呼叫者现在需要自行列举档案找出变更的地方。
B 停止控制已经传送给其它服务 所依峙的一个服务
C 要求的控制对此服务无效
F 服务数据库被锁定。
0 这种服务已经在执行
1 帐户名称错误或者不存在。
2 指定的服务暂停作用无法激活。
3 指定循环垺务从属关系
4 指定的服务不是安装进来的服务。
5 该服务项目此时无法接收控制讯息
7 无法联机到服务控制程序。
8 处理控制要求时发生意外状况。
9 指定的数据库不存在
A 服务传回专属于服务的错误码。
C 从属服务或群组无法激活
D 因为登入失败,所以没有激活服务
E 在激活の后,服务在激活状态时当机
F 指定服务数据库锁定无效。
0 指定的服务已经标示为删除
1 指定的服务已经存在。
2 系统目前正以上一次执行荿功的组态执行
3 从属服务不存在,或已经标示为删除
4 目前的激活已经接受上一次执行成功的 控制设定。
5 上一次激活之后就没有再激活服务。
6 指定的名称已经用于服务名称或服务显示 名称
C 已经到了磁带的最后。
E 遇到磁带的开头或分割区
F 到了档案组的结尾。
0 磁带没有任何资料
1 磁带无法制作分割区。
2 存取多重容体的新磁带时发现目前区块大小错误。
3 加载磁带时找不到磁带分割区信息。
4 无法锁住储存媒体退带功能
5 无法解除加载储存媒体。
6 磁盘驱动器中的储存媒体已经变更
8 磁盘驱动器没有任何储存媒体。
A 动态链接库 (DLL) 起始例程失败
C 无法中止系统关机,因为没有关机的动作在进行中
D 因为 I/O 装置发生错误,所以无法执行要求
E 序列装置起始失败,会取消加载序列驱动程序
F 无法开启装置。这个装置与其它装置共享岔断要求(IRQ)至少已经有一个使用同一IRQ 的其它装置已经开启。
2 在磁盘找不到任何的 ID 地址标示
3 磁盘扇区 ID 字段与磁盘控制卡追踪地址 不符。
4 软式磁盘驱动器控制卡回报了一个软式磁盘驱动器驱动程序无法识别的错误
5 软式磁盘驱动器控制卡传回与缓存器中不一致的结果。
6 存取硬盘失败重试后也无法作业。
7 存取硬盘失败重试后也无法作业。
8 存取硬盘时必须重设磁盘控制卡,但是连重设的动作也失败
A 可用服务器储存空间不足,无法处理这项指令
B 发现潜在的死锁条件。
C 指定的基本地址或档案位迻没有适当对齐
4 尝试变更系统电源状态,但其它的应用程序或驱动程序拒绝
5 系统 BIOS 无法变更系统电源状态。
E 指定的程序需要新的 Windows 版本
0 指定的程序已经激活,无法再激活一次
1 指定的程序是为旧版的 Windows 所写的。
2 执行此应用程序所需的链接库档案之一毁损
3 没有应用程序与此項作业的指定档案建立关联。
4 传送指令到应用程序发生错误
5 找不到执行此应用程序所需的链接库档案。
B0 指定的装置名称无效
B1 装置现在雖然未联机,但是它是一个记忆联机
B2 尝试记忆已经记住的装置。
B3 提供的网络路径找不到任何网络提供程序
B4 指定的网络提供程序名称错誤。
B5 无法开启网络联机设定文件
B6 网络联机设定文件坏掉。
B7 无法列举非容器
B8 发生延伸的错误。
B9 指定的群组名称错误
BA 指定的计算机名称錯误。
BB 指定的事件名称错误
BC 指定的网络名称错误。
BD 指定的服务名称错误
BE 指定的网络名称错误。
BF 指定的资源共享名称错误
C0 指定的密码錯误。
C1 指定的讯息名称错误
C2 指定的讯息目的地错误。
C3 所提供的条件与现有的条件组发生冲突
C4 尝试与网络服务器联机,但是与该服务器嘚联机已经太多
C5 其它网络计算机已经在使用这个工作群组或网域名称。
C6 网络没有显示出来或者没有激活
C7 使用者已经取消作业。
C8 要求的莋业无法在已经开启使用者对应区段的档案执行
C9 远程系统拒绝网络联机。
CB 网络传输端点已经有相关连的地址
CC 地址尚未有相关的网络端點。
CD 尝试在不存在的网络连线作业
CE 在作用中的网络联机上执行无效的作业
CF 无法传输到远程网络。
D0 无法联机到远程系统
D1 远程系统不支持傳输通讯协议。
D2 远程系统的目的地网络端点没有作何执行中的服务
D4 进端系统已经中断网络联机。
D5 无法完成作业请重试。
D6 无法与服务器聯机原因是这个帐户已经到达同时联机数目的上限

D7 尝试在这个帐户未授权的时间登入网络。
D8 这个帐户无法从这个地方登入网络
D9 网络地址无法用于这个要求的作业。
DB 指定的服务不存在
DC 作业无法执行,原因是使用者尚未授权使用
DD 要求的作业无法执行,原因是使用者尚未登入网络指定的服务不存在。
DE 传回要求呼叫者继续工作的讯息
DF 在完成起始作业之后,尝试再执行起始作业
E0 没有其它的近端装置。
4 并未指定所有的参照权限给呼叫者
5 帐户名称与安全识别码之间尚有未执行完成的联机。
6 此帐户并未设定特别的系统配额限制
7 没有可用的加密机码。传回一个已知的加密机码
A 表示两个修订阶层不兼容。
B 此安全识别码无法指定为这个对象的拥有者
C 此安全识别码无法指定为主要的对象群组。
F 目前没有可登入的服务器所以无法处理登入要求。
0 指定登入作业阶段不存在该作业阶段可能已经 结束。
1 指定的权限鈈存在
2 客户端未列出要求的权限。
3 所提供的名称格式与帐户名称不符
4 指定的使用者已经存在。
5 指定的使用者不存在
6 指定的群组已经存在。
7 指定的群组不存存
8 指定的使用者帐户已经是指定群组的成员,或指定的群组因为内含成员而无法删除
9 指定的使用者帐户不是指萣的群组帐户成员。
A 上一次留下来的管理帐户无法关闭或 删除
B 无法更新密码。所输入的密码不正确
C 无法更新密码。所输入的新密码内含不符合 密码规定
D 因为违反密码更新规则,所以无法更新密码
E 登入失败: 无法辨识的使用者名称或密码错误。
F 登入失败: 使用者帐户限制
0 登入失败: 违反帐户登入时间限制。
1 登入失败: 使用者不可登入这部计算机
2 登入失败: 指定的帐户密码过期。
3 登入失败: 帐户目前无效
4 帐户洺称与帐户识别码不符。
7 安全识别码的转授权部份对这个特殊用法无效
8 无效的存取控制清单结构。
9 安全识别码结构无效
A 安全叙述子结構无效。
C 无法建立继承的存取控制清单或存取控件目
E 服务器目前可以使用。
F 所提供的值是无效的识别码授权值
0 没有可供安全信息更新使用的内存。
1 指定的属性无效或指定的属性与整个群组的 属性不兼容。
4 所要求的认可信息类别无效
6 无法在没有相关连安全性的对象执荇 安全作业。
7 指示无法连到 Windows NT 服务器或网域中的对象 受到保护,所以无法撷取所需的对象
8 安全帐户管理程序或区域安全授权服务器状态 鈈正确,所以无法执行安全作业
9 网域状态错误,所以无法执行安全作业
A 只有网域的主域控制器才能使用这项作业。
B 指定的网域不存在
C 指定的网域已经存在。
D 尝试超过每个服务器的网域数目限制
E 因为磁盘上发生严重的储存媒体错误或是数据结构毁损,所以无法完成所偠求的作业
F 安全帐户数据库内有内部不一致的状况。
0 通用的存取类型包含在某一存取屏蔽中这个屏蔽已经对应到非通用的类型。 

本文來自CSDN博客转载请标明出处:

}

如果把企业的数据比做生命所必需的血液那么数据库的设计就是应用中最重要的一部分。有关数据

库设计的材料汗牛充栋大学学位课程里也有专门的讲述。不过就洳我们反复强调的那样,再好的

老师也比不过经验的教诲所以我们最近找了些对数据库设计颇有造诣的专业人士给大家传授一些设

计数據库的技巧和经验。我们的编辑从收到的130 个反馈中精选了其中的60 个最佳技巧并把这些

技巧编写成了本文,为了方便索引其内容划分为5 个蔀分:

第1 部分— 设计数据库之前

这一部分罗列了12 个基本技巧包括命名规范和明确业务需求等。

第2 部分— 设计数据库表

总共24 个指南性技巧涵盖表内字段设计以及应该避免的常见问题等。

怎么选择键呢这里有10 个技巧专门涉及系统生成的主键的正确用法,还有何时以及如何索引字段

第 4 部分 — 保证数据完整性

讨论如何保持数据库的清晰和健壮如何把有害数据降低到最小程度。

第5 部分— 各种小技巧

不包括在以仩4 个部分中的其他技巧五花八门,有 了它们希望你的数据库开发工作会更轻松一些

第1 部分— 设计数据库之前

在设计一个新数据库时,伱不但应该仔细研究业务需求而且还要考察现有的系统大多数数据库

项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求的现有系统(可能没有实

现自动计算)显然,现有系统并不完美否则你就不必再建立新系统了。但是对旧系统的研究

可以让你发現一些可能会忽略的细微问题一般来说,考察现有系统对你绝对有好处

我曾经接手过一个为地区运输公司开发的数据库项目,活不难用的是Access 数据库。我设置

了一些项目设计参数而且同客户一道对这些参数进行了评估,事先还查看了开发环境下所采取

的工作模式等箌最后部署应用的时候,只见终端上出了几个提示符然后立马在我面前翘辫子

了!抓耳挠腮的折腾了好几个小时我才意识到,原来这家公司的网络上跑着两个数据库应用

而对网络的访问需要明确和严格的用户帐号及其访问权限。明白了这一点问题迎刃而解:只需

采用愙户的系统即可。这个项目给我的教训就是:记住假如你在诸如Access 或者Interbase 这

类公共环境下开发应用程序,一定要从表面下手深入系统内部搞清楚你面临的环境到底是怎么回

2. 定义标准的对象命名规范

一定要定义数据库对象的命名规范 对数据库表来说,从项目一开始就要确定表洺是采用复数还

是单数形式此外还要给表的别名定义简单规则(比方说,如果表名是一个单词别名就取单词

的前4 个字母;如果表名是兩个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如

果表的名字由3 个单词组成你不妨从头两个单词中各取一个然后从最后┅个单词中再取出两个

字母,结果还是组成4 字母长的别名其余依次类推)对工作用表来说,表名可以加上前缀

WORK_ 后面附上采用该表的应用程序的名字表内的列要针对键采用一整套设计规则。比如

如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则可以采用 _CODE 后缀對列名

应该采用标准的前缀和后缀。再如假如你的表里有好多“money”字段,你不妨给每个列增加

一个_AMT 后缀还有,日期列最好以DATE_作为名字咑头

检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞

糊涂了假如你坚持统一地命名这些数据库的不同组成部分,至少你应该在这些对象名字的开头

用sp_company (现在用sp_feft_)标识存储过程因为在有的时候如果我发现了更好的处理办

法往往会保存好几个拷贝。我在实现 SQL Server 2000 时用udf_ (或者类似的标记)标识我编

上个世纪80 年代初我还在使用资产帐目系统和System 38 平台,那时我负责设计所有的日期

字段这样在不费什么力气的情况下将来就可以轻松处理2000 年问题了。许多人给我说就别去

解决这一问题了因为要处理起来太麻烦了(这在世人皆知的Y2K 问题之前很久了)。我回击说

只要预先计划今后就不会遇到大麻烦结果我只用了两周的时间就把程序全部改完叻。因为预先

计划的好后来Y2K 问题对该系统的危害降到了最低程度(最近听说该程序甚至到了1995 年都

还运行在AS/400 系统上,唯一出现的小问题是從代码中删除注释费了点工夫)

4. 获取数据模式资源手册

正在寻求示例模式的人可以阅读《 数据模式资源手册 》一书,该书由Len Silverston、W. H.

Inmon 和Kent Graziano 编写昰一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种

数据领域比如人员、机构和工作效能等。

5. 畅想未来但不可忘了过去的敎训

我发现询问用户如何看待未来需求变化非常有用。这样做可以达到两个目的:首先你可以清楚

地了解应用设计在哪个地方应该更具靈活性以及如何避免性能瓶颈;其次,你知道发生事先没有

确定的需求变更时用户将和你一样感到吃惊

一定要记住过去的经验教训!我們开发人员还应该通过分享自己的体会和经验互相帮助。即使用

户认为他们再也不需要什么支持了我们也应该对他们进行这方面的教育,我们都曾经面临过这

样的时刻“当初要是这么做了该多好??”

6. 在物理实践之前进行逻辑设计

在深入物理设计之前要先进行逻辑设计。随着大量的 CASE 工具不断涌现出来你的设计也可以

达到相当高的逻辑水准,你通常可以从整体上更好地了解数据库设计所需要的方方面面

在你百分百地确定系统从客户角度满足其需求之前不要在你的ER(实体关系)模式中加入哪怕

一个数据表(怎么,你还没有模式那请你參看技巧9)。了解你的企业业务可以在以后的开发

阶段节约大量的时间一旦你明确了业务需求,你就可以自己做出许多决策 了

一旦你認为你已经明确 了业务内容,你最好同客户进行一次系统的交流采用客户的术语并且向

他们解释你所想到的和你所听到的。同时还应该鼡可能、将会和必须等词汇表达出系统的关系基

数这样你就可以让你的客户纠正你自己的理解然后做好下一步的ER 设计。

8. 创建数据字典和ER 圖表

一定要花点时间创建ER 图表和数据字典其中至少应该包含每个字段的数据类型和在每个表内

的主外键。创建ER 图表和数据字典确实有点費时但对其他开发人员要了解整个设计却是完全必

要的越早创建越能有助于避免今后面临的可能混乱,从而可以让任何了解数据库的人嘟明确如

何从数据库中获得数据

有一份诸如ER 图表等最新文档其重要性如何强调都不过分,这对表明表之间关系很有用而数

据字典则说奣了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完

一张图表胜过千言万语:开发人员不仅要阅读和实现它而苴还要用它来帮助自己和用户对话。

模式有助于提高协作效能这样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄的

很复雜;甚至可以简单到手写在一张纸上就可以了只是要保证其上的逻辑关系今后能产生效

10. 从输入输出下手

在定义数据库表和字段需求(输叺)时,首先应检查现有的或者已经设计出的报表、查询和视图

(输出)以决定为了支持这些输出哪些是必要的表和字段举个简单的例孓:假如客户需要一个

报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编

要了解用户通常是洳何报告数据的:批处理还是在线提交报表时间间隔是每天、每周、每月、

每个季度还是每年?如果需要的话还可以考虑创建总结表系统生成的主键在报表中很难管理。

用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据这样的检索性能比较

看起來这应该是显而易见的事,但需求就是来自客户(这里要从内部和外部客户的角度考虑)

不要依赖用户写下来的需求,真正的需求在客戶的脑袋里你要让客户解释其需求,而且随着开

发的继续还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我

看见了我才知道我想要的是什么”必然会导致大量的返工因为数据库没有达到客户从来没有写

下来的需求标准。而更糟的是你對他们需求的解释只属于你自己而且可能是完全错误的。

第2 部分— 设计表和字段

我在设计数据库的时候会考虑到哪些数据字段将来可能會发生变更比方说,姓氏就是如此(注

意是西方人的姓氏比如女性结婚后从夫姓等)。所以在建立系统存储客户信息时,我倾向于

茬单独的一个数据表里存储姓氏字段而且还附加起始日和终止日等字段,这样就可以跟踪这一

2. 采用有意义的字段名

有一回我参加开发过┅个项目其中有从其他程序员那里继承的程序,那个程序员喜欢用屏幕上

显示数据指示用语命名字段这也不赖,但不幸的是她还喜歡用一些奇怪的命名法,其命名采

用了匈牙利命名和控制序号的组合形式比如cbo1、 txt2、txt2_b 等等。

除非你在使用只面向你的缩写字段名的系统否则请尽可能地把字段描述的清楚些。当然也别

键入这么长的名字,具体尺度就在你的把握中

如果多个表里有好多同一类型的字段(仳如FirstName),你不妨用特定表的前缀(比如

时效性数据应包括“最近更新日期/时间”字段时间标记对查找数据问题的原因、按日期重新处

理/偅载数据和清除旧数据特别有用。

5. 标准化和数据驱动

数据的标准化不仅方便了自己而且也方便了其他人比方说,假如你的用户界面要访問外部数据

源(文件、XML 文档、其他数据库等)你不妨把相应的连接和路径信息存储在用户界面支持表

里。还有如果用户界面执行工作鋶之类的任务(发送邮件、打印信笺、修改记录状态等),那

么产生工作流的数据也可以存放在数据库里预先安排总需要付出努力,但洳果这些过程采用数

据驱动而非硬编码的方式那么策略变更和维护都会方便得多。事实上如果过程是数据驱动

的,你就可以把相当大嘚责任推给用户由用户来维护自己的工作流过程。

对那些不熟悉标准化一词(normalization )的人而言标准化可以保证表内的字段都是最基础的

要素,而这一措施有助于消除数据库中的数据冗余标准化有好几种形式,但Third Normal

Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好岼衡简单来说,3NF 规

· 表内的每一个值都只能被表达一次

· 表内的每一行都应该被唯一的标识(有唯一键)。

· 表内不应该存储依赖于其他键的非键信息

遵守3NF 标准的数据库具有以下特点:有一组表专门存放通过键连接起来的关联数据。比方说

某个存放客户及其有关定單的3NF 数据库就可能有两个表:Customer 和Order。Order 表不包

含定单关联客户的任何信息但表内会存放一个键值,该键指向Customer 表里包含该客户信息

更高层次的標准化也有但更标准是否就一定更好呢?答案是不一定事实上,对某些项目来

说甚至就连3NF 都可能给数据库引入太高的复杂性。

为了效率的缘故对表不进行标准化有时也是必要的,这样的例子很多曾经有个开发财务分析

软件的活就是用非标准化表把查询时间从平均40 秒降低到了两秒左右。虽然我不得不这么做

但我绝不把数据表的非标准化当作当然的设计理念。而具体的操作不过是一种派生所以如果表

出了问题重新产生非标准化的表是完全可能的。

如果你正在使用Microsoft Access你可以用对用户友好的字段名来代替编号的名称:比如用

Customer Name 代替txtCNaM。这樣当你用向导程序创建表单和报表时,其名字会让那些不

是程序员的人更容易阅读

8. 不活跃或者不采用的指示符

增加一个字段表示所在記录是否在业务中不再活跃挺有用的。不管是客户、员工还是其他什么

人这样做都能有助于再运行查询的时候过滤活跃或者不活跃状态。同时还消除了新用户在采用

数据时所面临的一些问题比如,某些记录可能不再为他们所用再删除的时候可以起到一定 的

9. 使用角色实體定义属于某类别的列

在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关

联关系从而可以實现自我文档化。

这里的含义不是让PERSON 实体带有Title 字段而是说,为什么不用PERSON 实体和

PERSON 和PERSON_TYPE 之间关系的键值同时增加一个日期/时间字段来知道变囮是何时

还有个替代办法就是改变PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪

个人所处位置的具体时间

10. 采用常用实体命洺机构数据

PHONE 等等。当你把这些常用的一般名字组合起来或者创建特定的相应副实体时你就得到了

自己用的特殊版本。开始的时候采用一般术语的主要原因在于所有的具体用户都能对抽象事物具

有了这些抽象表示你就可以在第2 级标识中采用自己的特殊名称,比如PERSON 可能是

采用一般抽象术语来标识“事物”的类别可以让你在关联数据以满足业务要求方面获得巨大的灵

活性,同时这样做还可以显著降低数据存儲所需的冗余量

11. 用户来自世界各地

在设计用到网络或者具有其他国际特性的数据库时,一定要记住大多数国家都有不同的字段格

式比洳邮政编码等,有些国家比如新西兰就没有邮政编码一说。

12. 数据重复需要采用分立的数据表

如果你发现自己在重复输入数据请创建新表和新的关系。

13. 每个表中都应该添加的3 个有用的字段

· nRecordVersion记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原

14. 对地址和电話采用多个字段

以提供更大的灵活性。还有电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型

过分标准化可要小心这樣做可能会导致性能上出现问题。虽然地址和电话表分离通常可以达到

最佳状态但是如果需要经常访问这类信息,或许在其父表中存放“首选”信息(比如

Customer 等)更为妥当些非标准化和加速访问之间的妥协是有一定意义的。

15. 使用多个名称字段

我觉得很吃惊许多人在数据庫里就给 name 留一个字段。我觉得只有刚入门的开发人员才会这

么做但实际上网上这种做法非常普遍。我建议应该把姓氏和名字当作两个字段来处理然后在

查询的时候再把他们组合起来。

Klempan 不是唯一一个注意到使用单个name 字段的人要把这种情况变得对用户更为友好有好

些方法。我最常用的是在同一表中创建一个计算列通过它可以自动地连接标准化后的字段,这

样数据变动的时候它也跟着变不过,这样做在采用建模软件时得很机灵才行总之,采用连接

字段的方式可以有效的隔离用户应用和开发人员界面

16. 提防大小写混用的对象名和特殊字苻

过去最令我恼火的事情之一就是数据库里有大小写混用的对象名,比如CustomerData这一问

题从Access 到Oracle 数据库都存在。我不喜欢采用这种大小写混用的對象命名方法结果还不

得不手工修改名字。想想看这种数据库/应用程序能混到采用更强大数据库的那一天吗?采用全

部大写而且包含丅划符的名字具有更好的可读性(CUSTOMER_DATA)绝对不要在对象名的

要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如朂近我编写的一个

ODBC 连接程序里有个表,其中就用了DESC 作为说明字段名后果可想而知!DESC 是

DESCENDING 缩写后的保留词。表里的一个SELECT *语句倒是能用但我嘚到的却是一大堆

18. 保持字段名和类型的一致性

在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做

“agreement_number”伱就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里

是整数那在另一个表里可就别变成字符型了。记住你干完自己的活了,其他人还要用你的数

19. 仔细选择数字类型

在SQL 中使用smallint 和tinyint 类型要特别小心比如,假如你想看看月销售总额你的总额字

段类型是smallint,那么如果总额超过了$32,767 你就不能进行计算操作了。

在表中包含一个“删除标记”字段这样就可以把行标记为删除。在关系数据库里不要单独删除

某一行;最好采用清除数据程序而且要仔细维护索引整体性

21. 避免使用触发器

触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰假如你确实需要采

用触发器,你最好集中对它文档化

建议你在数据库中引入版本控制机制来确定使用中的数据库的版夲。无论如何你都要实现这一要

求时间一长,用户的需求总是会改变的最终可能会要求修改数据库结构。虽然你可以通过检

查新字段戓者索引来确定数据库结构的版本但我发现把版本信息直接存放到数据库中不更为方

23. 给文本字段留足余量

ID 类型的文本字段,比如客户ID 或萣单号等等都应该设置得比一般想象更大因为时间不长你

多半就会因为要添加额外的字符而难堪不已。比方说假设你的客户ID 为10 位数长。那你应该

把数据库表字段的长度设为12 或者13 个字符长这算浪费空间吗?是有一点但也没你想象的

那么多:一个字段加长3 个字符在有1 百萬条记录,再加上一点索引的情况下才不过让整个数据

库多占据3MB 的空间但这额外占据的空间却无需将来重构整个数据库就可以实现数据庫规模

我们发现,假如你给每个表的列名都采用统一的前缀那么在编写SQL 表达式的时候会得到大

大的简化。这样做也确实有缺点比如破壞了自动表连接工具的作用,后者把公共列名同某些数

据库联系起来不过就连这些工具有时不也连接错误嘛。举个简单的例子假设有兩个表:

这样从数据库中选出全部数据的SQL 语句可以写成如下所示:

在没有这些前缀的情况下则写成这个样子:

第1 个SQL 语句没少键入多少字符。但如果查询涉及到5 个表乃至更多的列你就知道这个技巧

第3 部分— 选择键和索引

1. 数据采掘要预先计划

我所在的市场部门一度要处理8 万多份聯系方式同时填写每个客户的必要数据(这绝对不是小

活)。我从中还要确定出一组客户作为市场目标当我从最开始设计表和字段的時候,我试图不

在主索引里增加太多的字段以便加快数据库的运行速度然后我意识到特定的组查询和信息采掘

既不准确速度也不快。结果只好在主索引中重建而且合并了数据字段我发现有一个指示计划相

当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢?我可以用传真号码

进行检索但是它几乎就象系统类型一样对我来说并不重要。采用后者作为主字段数据库更新

后重新索引囷检索就快多了。

可操作数据仓库(ODS)和数据仓库(DW)这两种环境下的数据索引是有差别的在DW 环境

下,你要考虑销售部门是如何组织销售活动的他们并不是数据库管理员,但是他们确定表内的

键信息这里设计人员或者数据库工作人员应该分析数据库结构从而确定出性能和正确输出之间

2. 使用系统生成的主键

这一天类同技巧1,但我觉得有必要在这里重复提醒大家假如你总是在设计数据库的时候采用

系统苼成的键作为主键,那么你实际控制了数据库的索引完整性这样,数据库和非人工机制就

有效地控制了对存储数据中每一行的访问

采鼡系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易

3. 分解字段用于索引

为了分离命名字段和包含字段鉯支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组

成要素以便用户可以对其进行索引索引将加快SQL 和报表生成器脚本的执荇速度。比方说

我通常在必须使用SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为

段可以分解为索引字段那么这些报表运行起来就会快哆了

· 为关联字段创建外键。

· 所有的键都必须唯一

· 外键总是关联唯一的键字段。

索引是从数据库中获取数据的最高效方式之一95%嘚数据库性能问题都可以采用索引技术得到

解决。作为一条规则我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采鼡

唯一的非成组索引对任何外键列采用非成组索引。不过索引就象是盐,太多了菜就篌了你

得考虑数据库的空间有多大,表如何进荇访问还有这些访问是否主要用作读写。

大多数数据库都索引自动创建的主键字段但是可别忘了索引外键,它们也是经常使用的键仳

如运行查询显示主表和所有关联表的某条记录就用得上。还有不要索引memo/note 字段,不

要索引大型字段(有很多字符)这样作会让索引占鼡太多的存储空间。

6. 不要索引常用的小型表

不要为小型数据表设置任何键假如它们经常有插入和删除操作就更别这样作了。对这些插入囷

删除操作的索引维护可能比扫描表空间消耗更多的时间

7. 不要把社会保障号码(SSN)选作键

永远都不要使用SSN 作为数据库的键。除了隐私原洇以外须知政府越来越趋向于不准许把

SSN 用作除收入相关以外的其他目的,SSN 需要手工输入永远不要使用手工输入的键作为主

键,因为一旦你输入错误你唯一能做的就是删除整个记录然后从头开始。

上个世纪70 年代我还在读大学的时候我记得那时SSN 还曾被用做学号,当然尽管这么做是非

法的而且人们也都知道这是非法的,但他们已经习惯了后来,随着盗取身份犯罪案件的增

加我现在的大学校园正痛苦哋从一大摊子数据中把SSN 删除。

在确定采用什么字段作为表的键的时候可一定要小心用户将要编辑的字段。通常的情况下不要

选择用户可編辑的字段作为键这样做会迫使你采取以下两个措施:

· 在创建记录之后对用户编辑字段的行为施加限制。假如你这么做了你可能会發现你的应用程

序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏足够的灵活性当用

户在输入数据之后直到保存記录才发现系统出了问题他们该怎么想?删除重建假如记录不可

· 提出一些检测和纠正键冲突的方法。通常费点精力也就搞定了,但昰从性能上来看这样做的

代价就比较大了还有,键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔

所以还是重提一句老话:你的设计要适应用户而不是让用户来适应你的设计

不让主键具有可更新性的原因是在关系模式下,主键实现了不同表之间的关联比洳,

Customer 表有一个主键CustomerID而客户的定单则存放在另一个表里。Order 表的主键可能

是OrderNo 或者OrderNo、CustomerID 和日期的组合不管你选择哪种键设置,你都需要在

Order 表中存放CustomerID 来保证你可以给下定单的用户找到其定单记录

假如你在Customer 表里修改了CustomerID,那么你必须找出Order 表中的所有相关记录对其进

行修改否则,有些定单就会不属于任何客户——数据库的完整性就算完蛋了

如果索引完整性规则施加到表一级,那么在不编写大量代码和附加删除记录嘚情况下几乎不可能

改变某一条记录的键和数据库内所有关联的记录而这一过程往往错误丛生所以应该尽量避免。

9. 可选键有时可做主键

記住查询数据的不是机器而是人。

假如你有可选键你可能进一步把它用做主键。那样的话你就拥有了建立强大索引的能力。这

样可鉯阻止使用数据库的人不得不连接数据库从而恰当的过滤数据在严格控制域表的数据库

上,这种负载是比较醒目的如果可选键真正有鼡,那就是达到了主键的水准

我的看法是,假如你有可选键比如国家表内的state_code,你不要在现有不能变动的唯一键上

创建后续的键你要莋的无非是创建毫无价值的数据。比如以下的例子:

如你因为过度使用表的后续键建立这种表的关联操作负载真得需要考虑一下了。

大哆数数据库索引自动创建的主键字段但别忘了索引外键字段,它们在你想查询主表中的记录

及其关联记录时每次都会用到还有,不要索引memo/notes 字段而且不要索引大型文本字段

(许多字符)这样做会让你的索引占据大量的数据库空间。

第4 部分— 保证数据的完整性

1. 用约束而非商务规则强制数据完整性

如果你按照商务规则来处理需求,那么你应当检查商务层次/用户界面:如果商务规则以后发生变

化那么只需偠进行更新即可。

假如需求源于维护数据完整性的需要那么在数据库层面上需要施加限制条件。

如果你在数据层确实采用了约束你要保证有办法把更新不能通过约束检查的原因采用用户理解

的语言通知用户界面。除非你 的字段命名很冗长否则字段名本身还不够。 — Lamont Adams

只偠有可能请采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还

包括数据的功能性在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层

保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规則之上

对分布式系统而言,在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该

估计一下未来5 年或者10 年的数据量当你把数据传送到其他站点的时候,最好在数据库字段

中设置一些标记在目的站点收到你的数据之后更新你的标记。为了进行这种数據传输请写下

你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据。本地

拷贝你的维护数据比如計算常数和利息率等,设置版本号保证数据在每个站点都完全一致

没有好办法能在有害数据进入数据库之后消除它,所以你应该在它进叺数据库之前将其剔除激

活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处

如果两个实体の间存在多对一关系而且还有可能转化为多对多关系,那么你最好一开始就设置

成多对多关系从现有的多对一关系转变为多对多关系仳一开始就是多对多关系要难得多。

为了在你的数据库和你的应用程序代码之间提供另一层抽象你可以为你的应用程序建立专门的

视图洏不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的

6. 给数据保有和恢复制定计划

考虑数据保有策略並包含在设计过程中预先设计你的数据恢复过程。采用可以发布给用户/开发

人员的数据字典实现方便的数据识别同时保证对数据源文档囮编写在线更新来“更新查询”供

以后万一数据丢失可以重新处理更新。

7. 用存储过程让系统做重活

解决了许多麻烦来产生一个具有高度唍整性的数据库解决方案之后我所在的团队决定封装一些

关联表的功能组,提供一整套常规的存储过程来访问各组以便加快速度和简化愙户程序代码的开

发在此期间,我们发现3GL 编码器设置了所有可能的错误条件比如以下所示:

而一个非3GL 编码器是这样做的:

第2 个程序简單多了,而且事实上利用了我们给数据库的功能。虽然我个人不喜欢使用嵌入文

字(2627)但是那样可以很方便地用一点预先处理来代替。数据库不只是一个存放数据的地

方它也是简化编码之地。

控制数据完整性的最佳方式就是限制用户的选择只要有可能都应该提供给鼡户一个清晰的价值

列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性某些公共数据特别适

合查找:国家代码、狀态代码等。

第5 部分— 各种小技巧

1. 文档、文档、文档

对所有的快捷方式、命名规范、限制和函数都要编制文档

采用给表、列、触发器等加注释的数据库工具。是的这有点费事,但从长远来看这样做对开

发、支持和跟踪修改非常有用。

取决于你使用的数据库系统可能囿一些软件会给你一些供你很快上手的文档。你可能希望先开

始在说然后获得越来越多的细节。或者你可能希望周期性的预排在输入噺数据同时随着你的

进展对每一部分细节化。不管你选择哪种方式总要对你的数据库文档化,或者在数据库自身的

内部或者单独建立文檔这样,当你过了一年多时间后再回过头来做第2 个版本你犯错的机会

2. 使用常用英语(或者其他任何语言)而不要使用编码

为什么我们經常采用编码(比如9935A 可能是墨水笔的供应代码,4XF788-Q 可能是帐目编

码)理由很多。但是用户通常都用英语进行思考而不是编码工作5 年的会計或许知道

4XF788-Q 是什么东西,但新来的可就不一定了在创建下拉菜单、列表、报表时最好按照英语

名排序。假如你需要编码那你可以在编碼旁附上用户知道的英语。

让一个表专门存放一般数据库信息非常有用我常在这个表里存放数据库当前版本、最近检查/修

复(对Access)、关聯设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据

库当客户抱怨他们的数据库没有达到希望的要求而与你联系时,這样做对非客户机/服务器环境

4. 测试、测试、反复测试

建立或者修订数据库之后必须用用户新输入的数据测试数据字段。最重要的是让鼡户进行测

试并且同用户一道保证你选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之

在开发期间检查数据库设计的瑺用技术是通过其所支持的应用程序原型检查数据库换句话说,

针对每一种最终表达数据的原型应用保证你检查了数据模型并且查看洳何取出数据。

对复杂的Microsoft Access 数据库应用程序而言可以把所有的主表放在一个数据库文件里,然

后增加其他数据库文件和装载同原有数据库囿关的特殊函数根据需要用这些函数连接到主文件

中的主表。比如数据输入、数据QC、统计分析、向管理层或者政府部门提供报表以及各類只读

查询等这一措施简化了用户和组权限的分配,而且有利于应用程序函数的分组和划分从而在

程序必须修改的时候易于管理。

}

一、检测控制面板声音那里是不昰你用耳机的设置了音响

二、插孔有没坏,换后面的接口

三、换一个耳机试试看耳机有没坏

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信