??xml version="1.0" encoding="utf-8" standalone="yes"?>久久爱www成人,999精品视频在这里,91在线观看免费观看http://www.aygfsteel.com/dangjava/zh-cnWed, 18 Jun 2025 06:06:16 GMTWed, 18 Jun 2025 06:06:16 GMT60数据库设计经验谈(9) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143232.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 09:43:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143232.htmlhttp://www.aygfsteel.com/dangjava/comments/143232.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143232.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143232.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143232.htmlW?5 部分 - 各种技?br />
  文档、文档、文?/strong>

  Ҏ有的快捷方式、命名规范、限制和函数都要~制文档?br />
  采用l表、列[字段]、触发器{加注释的数据库工具。是的,q有点费事,但从长远来看Q这样做对开发、支持和跟踪修改非常有用?br />
  取决于你使用的数据库pȝQ可能有一些Y件会l你一些供你很快上手的文档。你可能希望先开始在_然后获得来多的细节。或者你可能希望周期性的预排Q在输入新数据同旉着你的q展Ҏ一部分l节化。不你选择哪种方式Q总要对你的数据库文档化,或者在数据库自w的内部或者单独徏立文档。这P当你q了一q多旉后再回过头来做第 2 个版本,你犯错的Z大大减?

  使用常用pQ或者其他Q何语aQ而不要用编?/strong>

  Z么我们经帔R用编码(比如 9935A 可能?#8216;青岛啤酒’的供应代码,4XF788-Q 可能是帐目编码)Q理由很多。但是用户通常都用pq行思考而不是编码。工?5 q的会计或许知道 4XF788-Q 是什么东西,但新来的可就不一定了。在创徏下拉菜单、列表、报表时最好按照英语名排序。假如你需要编码,那你可以在编码旁附上用户知道的英语?

  保存常用信息

  让一个表专门存放一般数据库信息非常有用。我常在q个表里存放数据库当前版本、最q检?修复Q对 FoxProQ、关联设计文档的名称、客L信息。这样可以实CU简单机制跟t数据库Q当客户抱怨他们的数据库没有达到希望的要求而与你联pLQ这样做寚w客户?服务器环境特别有用?

  试、测试、反复测?/strong>

  建立或者修订数据库之后Q必ȝ用户新输入的数据试数据字段。最重要的是Q让用户q行试q且同用户一道保证你选择的数据类型满_业要求。测试需要在把新数据库投入实际服务之前完成?

  查设?/strong>

  在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话_针对每一U最l表达数据的原型应用Q保证你查了数据模型q且查看如何取出数据?

  Microsoft Visual FoxPro 设计技?/strong>

  对复杂的 Microsoft Visual FoxPro 数据库应用程序而言Q可以把所有的主表攑֜一个数据库容器文g里,然后增加其他数据库表文g和装载同原有数据库有关的Ҏ文g。根据需要用q些文gq接C文g中的主表。比如数据输入、数据烦引、统计分析、向理层或者政府部门提供报表以及各cdL询等。这一措施化了用户和组权限的分配,而且有利于应用程序函敎ͼ存储q程Q的分组和划分,从而在E序必须修改的时候易于管理?/span>

]]>
数据库设计经验谈(8) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143231.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 09:41:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143231.htmlhttp://www.aygfsteel.com/dangjava/comments/143231.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143231.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143231.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143231.htmlW?4 部分 - 保证数据的完整?br />
  用约束而非商务规则强制数据完整?/strong>

  如果你按照商务规则来处理需求,那么你应当检查商务层?用户界面Q如果商务规则以后发生变化,那么只需要进行更新即可。假如需求源于维护数据完整性的需要,那么在数据库层面上需要施加限制条件。如果你在数据层实采用了约束,你要保证有办法把更新不能通过U束查的原因采用用户理解的语a通知用户界面。除非你的字D命名很冗长Q否则字D名本nq不够?br />
  只要有可能,请采用数据库pȝ实现数据的完整性。这不但包括通过标准化实现的完整性而且q包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正性。不要依赖于商务层保证数据完整性;它不能保证表之间Q外键)的完整性所以不能强加于其他完整性规则之上?

  分布式数据系l?/strong>

  对分布式pȝ而言Q在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该估计一下未?5 q或?10 q的数据量。当你把数据传送到其他站点的时候,最好在数据库字D中讄一些标记。在目的站点收到你的数据之后更新你的标记。ؓ了进行这U数据传输,请写下你自己的批处理或者调度程序以特定旉间隔q行而不要让用户在每天的工作后传输数据。本地拷贝你的维护数据,比如计算常数和利息率{,讄版本号保证数据在每个站点都完全一致?

  
强制指示完整?参照完整?

  没有好办法能在有x据进入数据库之后消除它,所以你应该在它q入数据库之前将其剔除。激zL据库pȝ的指C完整性特性。这样可以保持数据的清洁而能q开发h员投入更多的旉处理错误条g?

  
关系

  如果两个实体之间存在多对一关系Q而且q有可能转化为多对多关系Q那么你最好一开始就讄成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多?br />
  采用视图

  Z在你的数据库和你的应用程序代码之间提供另一层抽象,你可以ؓ你的应用E序建立专门的视图而不必非要应用程序直接访问数据表。这样做q等于在处理数据库变更时l你提供了更多的自由?

  l数据保有和恢复制定计划

  考虑数据保有{略q包含在设计q程中,预先设计你的数据恢复q程。采用可以发布给用户/开发h员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在U更新来“更新查询”供以后万一数据丢失可以重新处理更新?br />
  用存储过E让pȝ做重z?/strong>

  解决了许多麻烦来产生一个具有高度完整性的数据库解x案之后,我决定封装一些关联表的功能组Q提供一整套常规的存储过E来讉K各组以便加快速度和简化客L序代码的开发。数据库不只是一个存放数据的地方Q它也是化编码之地?br />
  使用查找

  控制数据完整性的最x式就是限制用L选择。只要有可能都应该提供给用户一个清晰的价值列表供光择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找Q国家代码、状态代码等?br />
  预告:在第五部分将介绍各种技巧,不包括在以上 4 个部分中的其他技巧,五花八门Q有了它们希望你的数据库开发工作会更轻松一些?br clear="all" />


]]>
数据库设计经验谈(7) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143171.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 06:59:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143171.htmlhttp://www.aygfsteel.com/dangjava/comments/143171.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143171.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143171.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143171.html
  索引是从数据库中获取数据的最高效方式之一?5% 的数据库性能问题都可以采用烦引技术得到解冟뀂作Z条规则,我通常寚w辑主键使用唯一的成l烦引,对系l键Q作为存储过E)采用唯一的非成组索引Q对M外键列[字段]采用非成l烦引。不q,索引p是盐Q太多了菜就怺。你得考虑数据库的I间有多大,表如何进行访问,q有q些讉K是否主要用作d?br />
  大多数数据库都烦引自动创建的主键字段Q但是可别忘了烦引外键,它们也是l常使用的键Q比如运行查询显CZ表和所有关联表的某条记录就用得上。还有,不要索引 memo/note 字段Q不要烦引大型字D(有很多字W)Q这样作会让索引占用太多的存储空间?

不要索引常用的小型表

  不要为小型数据表讄M键,假如它们l常有插入和删除操作更别这样作了。对q些插入和删除操作的索引l护可能比扫描表I间消耗更多的旉?br />
不要把社会保障号码(SSNQ或w䆾证号码(IDQ选作?/strong>

  永远都不要?SSN ?ID 作ؓ数据库的键。除了隐U原因以外,ȝ政府来趋向于不准许把 SSN ?ID 用作除收入相关以外的其他目的QSSN ?ID 需要手工输入。永q不要用手工输入的键作Z键,因ؓ一旦你输入错误Q你唯一能做的就是删除整个记录然后从头开始?br />
  我在破解他h的程序时候,我看到很多h?SSN ?ID q曾被用做系列号Q当然尽这么做是非法的。而且Z也都知道q是非法的,但他们已l习惯了。后来,随着盗取w䆾犯罪案g的增加,我现在的同行正痛苦地从一大摊子数据中?SSN ?ID 删除?

不要用用L?br />
  在确定采用什么字D作的键的时候,可一定要心用户要~辑的字Dc通常的情况下不要选择用户可编辑的字段作ؓ键。这样做会迫使你采取以下两个措施Q?br />
  1.在创录之后对用户~辑字段的行为施加限制。假如你q么做了Q你可能会发C的应用程序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏够的灉|性。当用户在输入数据之后直C存记录才发现pȝZ问题他们该怎么惻I删除重徏Q假如记录不可重建是否让用户走开Q?br />
  2.提出一些检和U正键冲H的Ҏ。通常Q费点精力也搞定了Q但是从性能上来看这样做的代价就比较大了。还有,键的U正可能会迫使你H破你的数据和商?用户界面层之间的隔离?br /> 所以还是重提一句老话Q你的设计要适应用户而不是让用户来适应你的设计?br />
  不让主键h可更新性的原因是在关系模式下,主键实现了不同表之间的关联。比如,Customer 表有一个主?CustomerIDQ而客L定单则存攑֜另一个表里。Order 表的主键可能?OrderNo 或?OrderNo、CustomerID 和日期的l合。不你选择哪种键设|,你都需要在 Order 表中存放 CustomerID 来保证你可以l下定单的用h到其定单记录?br />
  假如你在 Customer 表里修改?CustomerIDQ那么你必须扑և Order 表中的所有相兌录对其进行修攏V否则,有些定单׃不属于Q何客户——数据库的完整性就完蛋了?br />
  如果索引完整性规则施加到表一U,那么在不~写大量代码和附加删除记录的情况下几乎不可能改变某一条记录的键和数据库内所有关联的记录。而这一q程往往错误丛生所以应该尽量避免?

可选键(候选键)有时可做主键

  CQ查询数据的不是机器而是人?br />
  假如你有可选键Q你可能q一步把它用做主键。那L话,你就拥有了徏立强大烦引的能力。这样可以阻止用数据库的h不得不连接数据库从而恰当的qo数据。在严格控制域表的数据库上,q种负蝲是比较醒目的。如果可选键真正有用Q那是辑ֈ了主键的水准?br />
  我的看法是,假如你有可选键Q比如国家表内的 state_codeQ你不要在现有不能变动的唯一键上创徏后箋的键。你要做的无非是创徏毫无价值的数据。如你因度用表的后l键[别名]建立q种表的兌Q操作负载真得需要考虑一下了?

别忘了外?br />
  大多数数据库索引自动创徏的主键字Dc但别忘了烦引外键字D,它们在你x询主表中的记录及其关联记录时每次都会用到。还有,不要索引 memo/notes 字段而且不要索引大型文本字段Q许多字W)Q这样做会让你的索引占据大量的数据库I间?

预告:在第四部分将讨论保证数据完整性,如何保持数据库的清晰和健壮,如何把有x据降低到最程度?/p>

]]>
数据库设计经验谈(6) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143167.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 06:45:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143167.htmlhttp://www.aygfsteel.com/dangjava/comments/143167.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143167.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143167.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143167.htmlW?3 部分 - 选择键和索引

数据采掘要预先计?/strong>

  我所在的某一客户部门一度要处理 8 万多份联pL式,同时填写每个客户的必要数据(q绝对不是小z)。我从中q要定Zl客户作为市场目标。当我从最开始设计表和字D늚时候,我试图不在主索引里增加太多的字段以便加快数据库的q行速度。然后我意识到特定的l查询和信息采掘既不准确速度也不快。结果只好在ȝ引中重徏而且合ƈ了数据字Dc我发现有一个指C划相当关键——当我想创徏pȝcd查找时ؓ什么要采用L作ؓȝ引字D呢Q我可以用传真号码进行检索,但是它几乎就象系l类型一样对我来说ƈ不重要。采用后者作Z字段Q数据库更新后重新烦引和索就快多了?br />
  可操作数据仓库(ODSQ和数据仓库QDWQ这两种环境下的数据索引是有差别的。在 DW 环境下,你要考虑销售部门是如何l织销售活动的。他们ƈ不是数据库管理员Q但是他们确定表内的键信息。这里设计h员或者数据库工作人员应该分析数据库结构从而确定出性能和正输Z间的最x件?

使用pȝ生成的主?br />
  q类同技?1Q但我觉得有必要在这里重复提醒大家。假如你L在设计数据库的时候采用系l生成的键作Z键,那么你实际控制了数据库的索引完整性。这P数据库和非h工机制就有效地控制了对存储数据中每一行的讉K?br />
  采用pȝ生成键作Z键还有一个优点:当你拥有一致的键结构时Q找到逻辑~陷很容易?

分解字段用于索引

  Z分离命名字段和包含字D以支持用户定义的报表,误虑分解其他字段Q甚至主键)为其l成要素以便用户可以对其q行索引。烦引将加快 SQL 和报表生成器脚本的执行速度。比方说Q我通常在必M?SQL LIKE 表达式的情况下创建报表,因ؓ case number 字段无法分解?year、serial number、case type ?defendant code {要素。性能也会变坏。假如年度和cd字段可以分解为烦引字D那么这些报表运行v来就会快多了?br />
键设?4 原则

  1.为关联字D创建外键?br />   2.所有的键都必须唯一?br />   3.避免使用复合键?br />   4.外键L兌唯一的键字段?/font>



]]>
数据库设计经验谈(5) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143161.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 06:14:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143161.htmlhttp://www.aygfsteel.com/dangjava/comments/143161.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143161.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143161.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143161.html

心保留?/strong>

  要保证你的字D名没有和保留词、数据库pȝ或者常用访问方法冲H,比如Q最q我~写的一?ODBC q接E序里有个表Q其中就用了 DESC 作ؓ说明字段名。后果可惌知QDESC ?DESCENDING ~写后的保留词。表里的一?SELECT * 语句倒是能用Q但我得到的却是一大堆毫无用处的信息?/p>

保持字段名和cd的一致?/strong>

  在命名字Dƈ为其指定数据cd的时候一定要保证一致性。假如字D在某个表中叫做“agreement_number”Q你别在另一个表里把名字Ҏ“ref1”。假如数据类型在一个表里是整数Q那在另一个表里可别变成字符型了。记住,你干完自qzMQ其他hq要用你的数据库呢?

仔细选择数字cd

  ?SQL 中?smallint ?tinyint cd要特别小心,比如Q假如你想看看月销售总额Q你的总额字段cd?smallintQ那么,如果总额过?$32,767 你就不能q行计算操作了?/p>

删除标记

  在表中包含一?#8220;删除标记”字段Q这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔l维护烦引整体性?

避免使用触发?/strong>

  触发器的功能通常可以用其他方式实现。在调试E序时触发器可能成ؓq扰。假如你实需要采用触发器Q你最好集中对它文档化?

包含版本机制

  你在数据库中引入版本控制机制来确定用中的数据库的版本。无论如何你都要实现q一要求。时间一长,用户的需求L会改变的。最l可能会要求修改数据库结构。虽然你可以通过查新字段或者烦引来定数据库结构的版本Q但我发现把版本信息直接存放到数据库中不更ؓ方便吗?

l文本字D늕余?/strong>

  ID cd的文本字D,比如客户 ID 或定单号{等都应该设|得比一般想象更大,因ؓ旉不长你多半就会因d额外的字W而难堪不巌Ӏ比方说Q假设你的客?ID ?10 位数ѝ那你应该把数据库表字段的长度设?12 或?13 个字W长。这浪费空间吗Q是有一点,但也没你惌的那么多Q一个字D加?3 个字W在?1 百万条记录,再加上一点烦引的情况下才不过让整个数据库多占?3MB 的空间。但q额外占据的I间却无需来重构整个数据库就可以实现数据库规模的增长了。n份证的号码从 15 位变?18 位就是最好和最惨痛的例子?

列[字段]命名技?/strong>

  我们发现Q假如你l每个表的列[字段]名都采用l一的前~Q那么在~写 SQL 表达式的时候会得到大大的简化。这样做也确实有~点Q比如破坏了自动表连接工L作用Q后者把公共列[字段]名同某些数据库联pv来,不过pq些工具有时不也q接错误嘛。D个简单的例子Q假设有两个表:

  Customer ?Order。Customer 表的前缀?cu_Q所以该表内的子D名如下Qcu_name_id、cu_surname、cu_initials 和cu_address {。Order 表的前缀?or_Q所以子D名是:or_order_id、or_cust_name_id、or_quantity ?or_description {?/p>

  q样从数据库中选出全部数据?SQL 语句可以写成如下所C:


  Select * From Customer, Order Where cu_surname = "MYNAME" ;
  and cu_name_id = or_cust_name_id and or_quantity = 1


  在没有这些前~的情况下则写成这个样子(用别名来区分Q:

  Select * From Customer, Order Where Customer.surname = "MYNAME" ;
  and Customer.name_id = Order.cust_name_id and Order.quantity = 1


  W?1 ?SQL 语句没少键入多少字符。但如果查询涉及?5 个表乃至更多的列[字段]你就知道q个技巧多有用了?

预告Q第 3 部分 - 选择?br />   怎么选择键呢Q这里有 10 个技巧专门涉及系l生成的主键的正用法,q有?时以及如何烦引字D以获得最x能{?/p>

]]>
数据库设计经验谈(4) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143158.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 06:02:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143158.htmlhttp://www.aygfsteel.com/dangjava/comments/143158.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143158.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143158.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143158.htmlMicrosoft Visual FoxPro 报表技?br />
  如果你正在?Microsoft Visual FoxProQ你可以用对用户友好的字D名来代替编L名称Q比如用 Customer Name 代替 txtCNaM。这P当你用向导程?[WizardsQ台湾hUCؓ‘_’] 创徏表单和报表时Q其名字会让那些不是E序员的人更Ҏ阅读?br />
不活跃或者不采用的指C符

  增加一个字D表C所在记录是否在业务中不再活跃挺有用的。不是客户、员工还是其他什么hQ这样做都能有助于再q行查询的时候过滤活跃或者不z跃状态。同时还消除了新用户在采用数据时所面的一些问题,比如Q某些记录可能不再ؓ他们所用,再删除的时候可以vC定的防范作用?

使用角色实体定义属于某类别的列[字段]

  在需要对属于特定cd或者具有特定角色的事物做定义时Q可以用角色实体来创建特定的旉兌关系Q从而可以实现自我文档化?br />
  q里的含义不是让 PERSON 实体带有 Title 字段Q而是_Z么不?PERSON 实体?PERSON_TYPE 实体来描qCh员呢Q比方说Q当 John Smith, Engineer 提升?John Smith, Director 乃至最后爬?John Smith, CIO 的高位,而所有你要做的不q是改变两个?PERSON ?PERSON_TYPE 之间关系的键|同时增加一个日?旉字段来知道变化是何时发生的。这P你的 PERSON_TYPE 表就包含了所?PERSON 的可能类型,比如 Associate、Engineer、Director、CIO 或?CEO {?br />
  q有个替代办法就是改?PERSON 记录来反映新头衔的变化,不过q样一来在旉上无法跟t个人所处位|的具体旉?

采用常用实体命名机构数据

  l织数据的最单办法就是采用常用名字,比如QPERSON、ORGANIZATION、ADDRESS ?PHONE {等。当你把q些常用的一般名字组合v来或者创建特定的相应副实体时Q你得C自己用的Ҏ版本。开始的时候采用一般术语的主要原因在于所有的具体用户都能Ҏ象事物具体化?br />
  有了q些抽象表示Q你可以在W?2 U标识中采用自己的特D名Uͼ比如QPERSON 可能?Employee、Spouse、Patient、Client、Customer、Vendor 或?Teacher {。同LQORGANIZATION 也可能是 MyCompany、MyDepartment、Competitor、Hospital、Warehouse、Government {。最?ADDRESS 可以具体?Site、Location、Home、Work、Client、Vendor、Corporate ?FieldOffice {?br />
  采用一般抽象术语来标识“事物”的类别可以让你在兌数据以满业务要求方面获得巨大的灉|性,同时q样做还可以显著降低数据存储所需的冗余量?

用户来自世界各地

  在设计用到网l或者具有其他国际特性的数据库时Q一定要C大多数国安有不同的字段格式Q比如邮政编码等Q有些国Ӟ比如新西兰就没有邮政~码一说?

数据重复需要采用分立的数据?/strong>

  如果你发现自己在重复输入数据Q请创徏新表和新的关pR?

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

  * dRecordCreationDateQ在 VB 下默认是 Now()Q而在 SQL Server 下默认ؓ GETDATE()
  * sRecordCreatorQ在 SQL Server 下默认ؓ NOT NULL DEFAULT USER
  * nRecordVersionQ记录的版本标记Q有助于准确说明记录中出?null 数据或者丢失数据的原因

对地址和电话采用多个字D?/strong>

  描述街道地址q短一行记录是不够的。Address_Line1、Address_Line2 ?Address_Line3 可以提供更大的灵zL。还有,电话L和邮件地址最好拥有自q数据表,光h自n的类型和标记cd?br />
  q分标准化可要小心,q样做可能会D性能上出现问题。虽然地址和电话表分离通常可以辑ֈ最佳状态,但是如果需要经常访问这cM息,或许在其父表中存?#8220;首?#8221;信息Q比?Customer {)更ؓ妥当些。非标准化和加速访问之间的妥协是有一定意义的?

使用多个名称字段

  我觉得很吃惊Q许多h在数据库里就l?name 留一个字Dc我觉得只有刚入门的开发h员才会这么做Q但实际上网上这U做法非常普遍。我应该把姓氏和名字当作两个字段来处理,然后在查询的时候再把他们组合v来?br />
  我最常用的是在同一表中创徏一个计列[字段]Q通过它可以自动地q接标准化后的字D,q样数据变动的时候它也跟着变。不q,q样做在采用建模软g时得很机灉|行。MQ采用连接字D늚方式可以有效的隔ȝ户应用和开发h员界面?br />
提防大小写؜用的对象名和Ҏ字符

  q去最令我恼火的事情之一是数据库里有大写L的对象名Q比?CustomerData。这一问题?Access ?Oracle 数据库都存在。我不喜Ƣ采用这U大写L的对象命名方法,l果q不得不手工修改名字。想想看Q这U数据库/应用E序能؜到采用更强大数据库的那一天吗Q采用全部大写而且包含下划W的名字h更好的可L(CUSTOMER_DATAQ,l对不要在对象名的字W之间留I格?/span>

]]>
数据库设计经验谈(3)(?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143100.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 02:50:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143100.htmlhttp://www.aygfsteel.com/dangjava/comments/143100.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143100.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143100.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143100.htmlW?2 部分 - 设计表和字段

查各U变?/strong>

  我在设计数据库的时候会考虑到哪些数据字D将来可能会发生变更。比方说Q姓氏就是如此(注意是西方h的姓氏,比如x结婚后从夫姓等Q。所以,在徏立系l存储客户信息时Q我們֐于在单独的一个数据表里存储姓氏字D,而且q附加v始日和终止日{字D,q样可以跟t这一数据条目的变化?/p>

采用有意义的字段?/strong>

  有一回我参加开发过一个项目,其中有从其他E序员那里承的E序Q那个程序员喜欢用屏q上昄数据指示用语命名字段Q这也不赖,但不q的是,她还喜欢用一些奇怪的命名法,其命名采用了匈牙利命名和控制序号的组合Ş式,比如 cbo1、txt2、txt2_b {等?/p>

  除非你在使用只面向你的羃写字D名的系l,否则请尽可能地把字段描述的清楚些。当Ӟ也别做过头了Q比?Customer_Shipping_Address_Street_Line_1Q虽然很富有说明性,但没人愿意键入这么长的名字,具体度在你的把握中?

采用前缀命名

  如果多个表里有好多同一cd的字D(比如 FirstNameQ,你不妨用特定表的前缀Q比?CusLastNameQ来帮助你标识字Dc?/p>

  时效性数据应包括“最q更新日?旉”字段。时间标记对查找数据问题的原因、按日期重新处理/重蝲数据和清除旧数据特别有用?/p>

标准化和数据驱动

  数据的标准化不仅方便了自p且也方便了其他人。比方说Q假如你的用L面要讉K外部数据源(文g、XML 文档、其他数据库{)Q你不妨把相应的q接和\径信息存储在用户界面支持表里。还有,如果用户界面执行工作之cȝdQ发送邮件、打CW、修改记录状态等Q,那么产生工作的数据也可以存攑֜数据库里。预先安排总需要付出努力,但如果这些过E采用数据驱动而非编码的方式Q那么策略变更和l护都会方便得多。事实上Q如果过E是数据驱动的,你就可以把相当大的责Ll用Pqhl护自己的工作流q程?

标准化不能过?/strong>

  寚w些不熟悉标准化一词(normalizationQ的言Q标准化可以保证表内的字D都是最基础的要素,而这一措施有助于消除数据库中的数据冗余。标准化有好几种形式Q但 Third Normal FormQ?NFQ通常被认为在性能、扩展性和数据完整性方面达C最好^衡。简单来_3NF 规定Q?/p>

  * 表内的每一个值都只能被表达一ơ?br />   * 表内的每一行都应该被唯一的标识(有唯一键)?br />   * 表内不应该存储依赖于其他键的非键信息?/p>

  遵守 3NF 标准的数据库h以下特点Q有一l表专门存放通过键连接v来的兌数据。比方说Q某个存攑֮户及其有兛_单的 3NF 数据库就可能有两个表QCustomer ?Order。Order 表不包含定单兌客户的Q何信息,但表内会存放一个键|该键指向 Customer 表里包含该客户信息的那一行?br />   更高层次的标准化也有Q但更标准是否就一定更好呢Q答案是不一定。事实上Q对某些目来说Q甚臛_q?3NF 都可能给数据库引入太高的复杂性?/p>

  Z效率的缘故,对表不进行标准化有时也是必要的,q样的例子很多。曾l有个开发餐饮分析Y件的zd是用非标准化表把查询旉从^?40 U降低到了两U左叟뀂虽然我不得不这么做Q但我绝不把数据表的非标准化当作当然的设计理c而具体的操作不过是一U派生。所以如果表Z问题重新产生非标准化的表是完全可能的?/p>

]]>
数据库设计经验谈(2) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143099.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 02:42:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143099.htmlhttp://www.aygfsteel.com/dangjava/comments/143099.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143099.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143099.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143099.html获取数据模式资源手册

  正在LCZ模式的h可以阅读《数据模式资源手册》一书,该书?Len Silverston、W. H. Inmon ?Kent Graziano ~写Q是一本值得拥有的最x据徏模图书。该书包括的章节늛多种数据领域Q比如h员、机构和工作效能{。其他的你还可以参考相关书c?


畅想未来Q但不可忘了q去的教?/strong>

  我发现询问用户如何看待未来需求变化非常有用。这样做可以辑ֈ两个目的Q首先,你可以清楚地了解应用设计在哪个地方应该更LzL以及如何避免性能瓉Q其ơ,你知道发生事先没有确定的需求变更时用户和你一h到吃惊?br />
  一定要Cq去的经验教训!我们开发h员还应该通过分n自己的体会和l验互相帮助。即使用戯Z们再也不需要什么支持了Q我们也应该对他们进行这斚w的教Ԍ我们都曾l面临过q样的时?#8220;当初要是q么做了该多?.”?


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

  在深入物理设计之前要先进行逻辑设计。随着大量?CASE 工具不断涌现出来Q你的设计也可以辑ֈ相当高的逻辑水准Q你通常可以从整体上更好C解数据库设计所需要的Ҏ面面?


了解你的业务

  在你癑ֈ癑֜定pȝ从客戯度满_需求之前不要在你的 ERQ实体关p)模式中加入哪怕一个数据表Q怎么Q你q没有模式?那请你参看技?9Q。了解你的企业业务可以在以后的开发阶D节U大量的旉。一旦你明确了业务需求,你就可以自己做出许多决策了?br />
  一旦你认ؓ你已l明了业务内容Q你最好同客户q行一ơ系l的交流。采用客L术语q且向他们解释你所惛_的和你所听到的。同时还应该用可能、将会和必须{词汇表辑ևpȝ的关pd数。这样你可以让你的客户U正你自q理解然后做好下一步的 ER 设计?


创徏数据字典?ER 图表

  一定要q旉创徏 ER 图表和数据字典。其中至应该包含每个字D늚数据cd和在每个表内的主外键。创?ER 图表和数据字典确实有点费时但对其他开发h员要了解整个设计却是完全必要的。越早创能有助于避免今后面的可能؜乱,从而可以让M了解数据库的人都明确如何从数据库中获得数据?br />
  有一份诸?ER 图表{最新文档其重要性如何强调都不过分,q对表明表之间关pd有用Q而数据字典则说明了每个字D늚用途以及Q何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的?


创徏模式

  一张图表胜q千a万语Q开发h员不仅要阅读和实现它Q而且q要用它来帮助自己和用户对话。模式有助于提高协作效能Q这样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄的很复杂Q甚臛_以简单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能生效益?


从输入输Z?/strong>

  在定义数据库表和字段需求(输入Q时Q首先应查现有的或者已l设计出的报表、查询和视图Q输出)以决定ؓ了支持这些输出哪些是必要的表和字DcD个简单的例子Q假如客户需要一个报表按照邮政编码排序、分D和求和Q你要保证其中包括了单独的邮政编码字D而不要把邮政~码p进地址字段里?


报表技?br />
  要了解用户通常是如何报告数据的Q批处理q是在线提交报表Q时间间隔是每天、每周、每月、每个季度还是每q_如果需要的话还可以考虑创徏ȝ表。系l生成的主键在报表中很难理。用户在hpȝ生成主键的表内用副键q行索往往会返回许多重复数据。这L索性能比较低而且Ҏ引v混ؕ?


理解客户需?/strong>

  看v来这应该是显而易见的事,但需求就是来自客Pq里要从内部和外部客L角度考虑Q。不要依赖用户写下来的需求,真正的需求在客户的脑袋里。你要让客户解释光求,而且随着开发的l箋Q还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我看见了我才知道我想要的是什?#8221;必然会导致大量的q工Q因为数据库没有辑ֈ客户从来没有写下来的需求标准。而更p的是你对他们需求的解释只属于你自己Q而且可能是完全错误的?/span>

]]>
数据库设计经验谈(1) (?http://www.aygfsteel.com/dangjava/archive/2007/09/06/143094.html当扎?/dc:creator>当扎?/author>Thu, 06 Sep 2007 02:34:00 GMThttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143094.htmlhttp://www.aygfsteel.com/dangjava/comments/143094.htmlhttp://www.aygfsteel.com/dangjava/archive/2007/09/06/143094.html#Feedback0http://www.aygfsteel.com/dangjava/comments/commentRss/143094.htmlhttp://www.aygfsteel.com/dangjava/services/trackbacks/143094.htmlW?1 部分 - 设计数据库之?br /> q一部分|列?12 个基本技巧,包括命名规范和明业务需求等?/p>

W?2 部分 - 设计数据库表
d 24 个指南性技巧,늛表内字段设计以及应该避免的常见问题等?/p>

W?3 部分 - 选择?br /> 怎么选择键呢Q这里有 10 个技巧专门涉及系l生成的主键的正用法,q有?时以及如何烦引字D以获得最x能{?/p>

W?4 部分 - 保证数据完整?br /> 讨论如何保持数据库的清晰和健壮,如何把有x据降低到最程度?/p>

W?5 部分 - 各种技?br /> 不包括在以上 4 个部分中的其他技巧,五花八门Q有了它们希望你的数据库开发工作会更轻松一些?br />
W?1 部分 - 设计数据库之?/strong>

考察现有环境

  在设计一个新数据库时Q你不但应该仔细研究业务需求而且q要考察现有的系l。大多数数据库项目都不是从头开始徏立的Q通常Q机构内M存在用来满特定需求的现有pȝQ可能没有实现自动计)。显Ӟ现有pȝq不完美Q否则你׃必再建立新系l了。但是对旧系l的研究可以让你发现一些可能会忽略的细微问题。一般来_考察现有pȝ对你l对有好处?


定义标准的对象命名规?/strong>

  一定要定义数据库对象的命名规范。对数据库表来说Q从目一开始就要确定表名是采用复数q是单数形式。此外还要给表的别名定义单规则(比方_如果表名是一个单词,别名取单词的前 4 个字母;如果表名是两个单词,各取两个单词的前两个字母组?4 个字母长的别名;如果表的名字?3 个单词组成,你不妨从头两个单词中各取一个然后从最后一个单词中再取Z个字母,l果q是l成 4 字母长的别名Q其余依ơ类推)对工作用表来_表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针寚w采用一整套设计规则。比如,如果键是数字cdQ你可以?_N 作ؓ后缀Q如果是字符cd则可以采?_C 后缀。对列[字段]名应该采用标准的前缀和后~。再如,假如你的表里有好?#8220;money”字段Q你不妨l每个列[字段]增加一?_M 后缀。还有,日期列[字段]最好以 D_ 作ؓ名字打头?br />
  查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。假如你坚持l一地命名这些数据库的不同组成部分,臛_你应该在q些对象名字的开头用 Table、Query 或?Report {前~加以区别?br />
  如果采用?Microsoft AccessQ你可以?qry、rpt、tbl ?mod {符h标识对象Q比?tbl_EmployeesQ。我在和 SQL Server 打交道的时候还用过 tbl 来烦引表Q但我用 sp_company Q现在用 sp_feft_Q标识存储过E,因ؓ在有的时候如果我发现了更好的处理办法往往会保存好几个拯。我在实?SQL Server 2000 时用 udf_ Q或者类似的标记Q标识我~写的函数?br />

工欲善其? 必先利其?/strong>

  采用理想的数据库设计工具Q比如:SyBase 公司?PowerDesignQ她支持 PB、VB、Delphe {语aQ通过 ODBC 可以q接市面上流行的 30 多个数据库,包括 dBase、FoxPro、VFP、SQL Server {,今后有机会我着重介l?PowerDesign 的用?/p>

]]>
Java 通过串口发短?Q{Q?/title><link>http://www.aygfsteel.com/dangjava/archive/2007/09/05/142805.html</link><dc:creator>当扎?/dc:creator><author>当扎?/author><pubDate>Wed, 05 Sep 2007 01:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/dangjava/archive/2007/09/05/142805.html</guid><wfw:comment>http://www.aygfsteel.com/dangjava/comments/142805.html</wfw:comment><comments>http://www.aygfsteel.com/dangjava/archive/2007/09/05/142805.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/dangjava/comments/commentRss/142805.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/dangjava/services/trackbacks/142805.html</trackback:ping><description><![CDATA[先简单的来介l一下如何?SMSLib 收发短信?br /> SMSLib 的唯一的入口类?CService c,该类主要负责讄各种讉K手机的参敎ͼ以及提供收发短信的功能?br /> CService cd有一个构造函?CService(String port, int baud, String gsmDeviceManufacturer, String gsmDeviceModel) 其中 port 是串口的端口号如 "COM5"Qbaud 是访问串口的速率Q该值的讑֮可以Ҏ你的讑֤理器里面的串口的属性中支持的L特率讑֮合适的|gsmDeviceManufacturer, gsmDeviceModel q两个参C要是用来定具体?ATHandler 的实玎ͼ如果你想?SMSLib 默认?ATHandlerQ这两个值都可以讄?null 或?"", 如果你想采用适合你自己手机型L特定?ATHandler 的时候,只要自己写一个?AbstractATHandler 的实现类Q然后再用相兛_U标识设|?gsmDeviceManufacturer, gsmDeviceModel 的值就可以了?br /> <br /> 接收短信的代码如下:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080"> 1</span> <span style="color: #000000">    </span><span style="color: #0000ff">try</span><span style="color: #000000"><br /> </span><span style="color: #008080"> 2</span> <span style="color: #000000">    {<br /> </span><span style="color: #008080"> 3</span> <span style="color: #000000">      CService srv </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> CService(</span><span style="color: #000000">"</span><span style="color: #000000">COM5</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">9600</span><span style="color: #000000">, </span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">null</span><span style="color: #000000">);<br /> </span><span style="color: #008080"> 4</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000">      srv.connect();<br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 7</span> <span style="color: #000000">      LinkedList messageList </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> LinkedList();<br /> </span><span style="color: #008080"> 8</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">      srv.readMessages(messageList, CIncomingMessage.MessageClass.All);<br /> </span><span style="color: #008080">10</span> <span style="color: #000000"><br /> </span><span style="color: #008080">11</span> <span style="color: #000000">      </span><span style="color: #008000">//</span><span style="color: #008000"> TODO: 处理q回?nbsp;messageList?/span><span style="color: #008000"><br /> </span><span style="color: #008080">12</span> <span style="color: #000000"><br /> </span><span style="color: #008080">13</span> <span style="color: #000000">      srv.disconnect();<br /> </span><span style="color: #008080">14</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080">15</span> <span style="color: #000000">    </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e)<br /> </span><span style="color: #008080">16</span> <span style="color: #000000">    {<br /> </span><span style="color: #008080">17</span> <span style="color: #000000">      e.printStackTrace();<br /> </span><span style="color: #008080">18</span> <span style="color: #000000">    }</span></div> <br /> 上面的代码是d手机中全部的短信Q你也可以通过讄 CIncomingMessage.MessageClass 参数来读取不同类型的短信Q比?CIncomingMessage.MessageClass.Read 表示只读取已ȝ信,CIncomingMessage.MessageClass.Unread 表示只读取未ȝ信,你也可以使用 readMessages(LinkedList messageList, int messageClass, int limit) d你想要的指定数目的几条短信?br /> <br /> 发短信的q程也很单,代码如下Q?br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080"> 1</span> <span style="color: #000000">    </span><span style="color: #0000ff">try</span><span style="color: #000000"><br /> </span><span style="color: #008080"> 2</span> <span style="color: #000000">    {<br /> </span><span style="color: #008080"> 3</span> <span style="color: #000000">      CService srv </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> CService(</span><span style="color: #000000">"</span><span style="color: #000000">COM5</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">9600</span><span style="color: #000000">, </span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">null</span><span style="color: #000000">);<br /> </span><span style="color: #008080"> 4</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000">      srv.connect();<br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 7</span> <span style="color: #000000">      COutgoingMessage msg </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> COutgoingMessage(</span><span style="color: #000000">"</span><span style="color: #000000">138102*****</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">我的W一条短信。。?/span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080"> 8</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">      msg.setMessageEncoding(CMessage.MessageEncoding.EncUcs2);<br /> </span><span style="color: #008080">10</span> <span style="color: #000000"><br /> </span><span style="color: #008080">11</span> <span style="color: #000000">      srv.sendMessage(msg);<br /> </span><span style="color: #008080">12</span> <span style="color: #000000"><br /> </span><span style="color: #008080">13</span> <span style="color: #000000">      srv.disconnect();<br /> </span><span style="color: #008080">14</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080">15</span> <span style="color: #000000">    </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e)<br /> </span><span style="color: #008080">16</span> <span style="color: #000000">    {<br /> </span><span style="color: #008080">17</span> <span style="color: #000000">      e.printStackTrace();<br /> </span><span style="color: #008080">18</span> <span style="color: #000000">    }</span></div> <br /> 发送中文短信时要设|消息的~码方式?CMessage.MessageEncoding.EncUcs2Q而且q要讄手机发送短信的协议?PDU 模式QCService 默认的协议就?PDU, 所以在上面的代码中没有讄?br /> <br /> 在后面的文章中我会l介l收发短信时各个参数的意义及如何讄?br /> <img src ="http://www.aygfsteel.com/dangjava/aggbug/142805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/dangjava/" target="_blank">当扎?/a> 2007-09-05 09:59 <a href="http://www.aygfsteel.com/dangjava/archive/2007/09/05/142805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ػ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">Ϸ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">౱</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">γ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank">ո</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ɫ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">ͨμ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ժ</a>| <a href="http://" target="_blank">ں</a>| <a href="http://" target="_blank">բ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>