免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3908 | 回复: 11
打印 上一主题 下一主题

[Q] 有关外键的讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-01-18 10:00 |只看该作者 |倒序浏览
在一个大型的数据库中,到底要不要用外键呢?
外键会影响系统的性能,但不用的话又要在程序中进行控制。

论坛徽章:
0
2 [报告]
发表于 2004-01-18 10:26 |只看该作者
1、外键一般都需要
2、外键主要解决冗余的问题
3、外键会影响系统的性能,所以适当的冗余是存在的,需要在2者间进行权衡

论坛徽章:
0
3 [报告]
发表于 2004-01-18 10:28 |只看该作者
2、外键主要解决冗余的问题
能不能解释一下这一点?

论坛徽章:
0
4 [报告]
发表于 2004-01-18 10:32 |只看该作者
A学生库=学生号码,学生姓名,班级编码(班级名称,班主任),出生年月。。。。
B班级库=班级编码,班级名称,班主任。。

班级编码就是A的外健啊,否则后面的信息必须重复定义了哦

论坛徽章:
0
5 [报告]
发表于 2004-01-18 11:06 |只看该作者
这个我明白。
但假设我是有这几表,我也是这么建的。但我就是不加外键!
我通过程序来控制。有没有问题?
如果可以的话,那外键根本就没用了。

论坛徽章:
0
6 [报告]
发表于 2004-01-18 11:11 |只看该作者
最初由 winy_huang 发布
[B]这个我明白。
但假设我是有这几表,我也是这么建的。但我就是不加外键!
我通过程序来控制。有没有问题?
如果可以的话,那外键根本就没用了。 [/B]


麻烦了啊   可以外键还可以保持数据的完整性啊

论坛徽章:
0
7 [报告]
发表于 2004-01-18 11:28 |只看该作者
嗯。是的。
说到性能问题,如果说我的表是像上面那样建的,但我加不加外键对性能有没有影响?

论坛徽章:
0
8 [报告]
发表于 2004-01-18 11:32 |只看该作者
基本没多大问题,在很大数据的统计上或许存在问题了,看具体情况的

论坛徽章:
0
9 [报告]
发表于 2004-01-18 15:02 |只看该作者
恩, 使用外键的时候, 可以避免写很多代码和手工设置的索引, 数据一致性可以得到很好的保证, 即使外部程序出现BUG, 也不会破坏数据.
但是使用外键的最大问题是, 可读性很差, 很难追踪错误, 特别是需要在LOG中准确记录错误的时候, 非常不方便. 因此, 通常采用双重控制, 首先, 在外部程序中进行控制以保证可读性, 然后数据库本身也做相关设定, 以保证安全性.
在开发阶段, 为了方便测试通常不设置外键.
另外, 虽然外键设置成CASCADE就能在主表删除记录的同时自动删除子表数据, 但这样的做法常常由于无法控制子表数据的删除(比如, 留下LOG等等)很少被使用. 特别是在大型系统中, 简化系统设定, 也是非常重要的考虑. 这样的做法就更少见了.

论坛徽章:
0
10 [报告]
发表于 2004-01-19 10:36 |只看该作者
我不用FK,举例说明吧
FK一般都是指向一些不常变化的代码表的,用于业务数据和代码数据之间的关联
假设代码表有2个字段,一个是代码一个是名称,当用外键的时候,一旦代码表中的名称发生改变就意味着所有的业务数据表关联的这个代码的名称都变成新版本的了,然而,很多时候我们需要保留历史状态,原来的记录中名称还是用老版本的,新加的记录就用新版本的名称。这样的应用就比较适合用数据冗余的策略来实现。
虽然,在Oracle等大型数据库中提供了一些触发可以根据规则来关联新、老版本的名称,但是,我个人认为这还是比较适合在大系统或通用系统中采用,因为,使用FK、参考、级联删除等策略只是把程序中的复杂度转移到了数据库端。只有养得起DBA或付得起服务费的单位才能用这样的系统。
个人认为比较妥当的解决方法是使用代码表的版本控制,让程序能够根据不同的条件应用不同版本的代码表。不过,这种做法很受到编程人员的抵制,主要是实现复杂、版本控制规则难确定。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP