wsdrex:查詢條件複雜不要緊。只要你用到了群聚索引就會快(有主鍵的表,主鍵包含的字段就是群聚索引)。 比方說a表有4個字段: a1 a2 a3 a4 其中a1,a2是群聚索引 如果你的查詢這樣寫的話: select * from a where a3 = ...... and a4 = ......不妨改成: select * from a where a3 = ...... and a4 = ...... and a1 <> ''
to zhuzhichao(炎龙骑士团—索尔—破龙击): 探讨一下: 我个人主张多用外键。理由如下: 1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。 2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。 3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。 4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是测试系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。
to SE1() :你說的也是有道理的。這個問題就如同藍兄說的那樣,存在就是合理。我只是提出我個人的看法而已,因為外鍵的存在,調試變得很麻煩。而且現在3層結構居多,商務邏輯等都可以放到業務層去處理。對於DB的升遷也是有好處的。
如果你的邏輯很清楚的話.
你完全可以用觸發器或者程式控制來完成這種約束.加上外鍵真的是很不方便,而且會使SQL的执行效率降低.
(當然觸發器也會降低執行的效率)
比方說a表有4個字段:
a1
a2
a3
a4
其中a1,a2是群聚索引
如果你的查詢這樣寫的話:
select * from a where a3 = ...... and a4 = ......不妨改成:
select * from a where a3 = ...... and a4 = ...... and a1 <> ''
探讨一下:
我个人主张多用外键。理由如下:
1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。
2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。
3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。
4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是测试系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。