查看: 10509|回复: 15

[精华] 公司已争得火花四溅了,请各位高人裁决

[复制链接]
论坛徽章:
0
发表于 2007-7-20 16:55 | 显示全部楼层 |阅读模式
系统设计中遇到如下问题,公司技术人员争论得十分激烈,各执一词,十分希望高手裁决之。我们公司技术人员都十分关注这个贴子:

1、采用代理主键作外键,还是代码code作外键
表1:代理主键——id,并取代码作唯一约束——code。
表2:参照表1时,其外键应参照code,还是id?
在这个问题上,有三种策略:
1)参照表1的id。优点是明显的,缺点是查询时必须进行表联接,尤其是有时需要对代码进行模糊查询的时候更是如此。
2)参照表1的code。优点是对代码进行模糊查询时不需进行表连接,缺点是code不能发生变动,否则将同步修改很多相关表。据说这是很多大公司的做法。
3)参照表1的id,并冗余一个code字段。同时具备第1、2条的优点,但也具有第2条的缺点。这种做法似乎很常见。
我个人认为应取第一种策略,对于确实影响性能的,经过分析后可以采用第三种策略以避免连接,优化性能,但无论如何不能采取第三种策略。

2、数据库视图的使用
有三类项目:类型A,类型B,类型C。这三类项目都有一些公共的特性(比如地区等信息。需要对面向全部项目统计查询),大约占字段总量的50%左右,这些公共特性经常需要在查询中用到。在数据库设计时有如下策略:
1)三个分类项目表+一个视图:三类项目分开建表(表:项目A,项目B,项目C),这样给项目的操作上带来很大便利,但同时给查询上带来了不便,要从所有项目中查找数据,必须参照三个表。为解决这个问题,从三个表中提取了一个视图,相当于 项目表。
2)一个项目表+三个分类项目表:建一个项目表,再建三个分类项目表(表:项目A,项目B,项目C),共四个表。这样给查询带来了方便,但给增加和修改操作带来了麻烦,这时必须修改两个表。
3)冗余策略:建一个项目表,全部属性设置在一个表内。这种策略给查询带来了方便,但增加操作却非常麻烦,必须把每一类项目要设置哪些字段弄清楚。
我比较看好第一种策略,这种策略在完全不冗余的情况下,实现了查询和增删改的简便性。但听说现在不推荐用视图,所以有些犹豫。

另外,我们目前虽使用hibernate,但完全是使用的单表模式,即没有建立一对多、多对多的关系,全部是针对一个表进行的操作。并且公司一位从大公司出来,并且很有经验的高手说,一般大公司,尤其是做ERP公司的,一般都是这种模式,以确保系统性能。面向对象普及这么多年,为什么在大型系统中始终不能得到应用呢?我真的疑惑了。
论坛徽章:
0
发表于 2007-7-20 17:15 | 显示全部楼层
呵呵,我不是高人,随便说说。
1、我倾向于第一种方案,即使要做关联查询,不见得对性能有多大影响;第二种方案很烦,而且code变动基本上不可避免;第三种方案不到万不得已,一般不使用,除非对性能影响特别大。

2、我比较倾向于第二种方案,可以建立一个主表,其他的A、B、C与其关联,应该不会出现同时更新多表的情况吧。主细表我以前用过很多,也没觉得有什么毛病。不知道你们为什么不推荐使用视图,是基于性能的考虑吗?

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2007-7-20 17:30 | 显示全部楼层
-->应该不会出现同时更新多表的情况吧。
不会。

-->不知道你们为什么不推荐使用视图,是基于性能的考虑吗?
是的。不知道目前视图在大的程序中有应用吗?

thanks

使用道具 举报

回复
论坛徽章:
0
发表于 2007-7-21 09:27 | 显示全部楼层
视图在大的程序中有应用

使用道具 举报

回复
论坛徽章:
32
2011新春纪念徽章
日期:2011-01-25 15:41:01马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14兰博基尼
日期:2013-11-04 12:55:50ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52
发表于 2007-7-23 18:58 | 显示全部楼层
用有一定规则的流水号隐藏更多的类别信息可以放到一个表中

使用道具 举报

回复
论坛徽章:
96
秀才
日期:2017-02-22 15:18:00玉兔
日期:2015-10-05 09:02:46双子座
日期:2015-08-10 18:45:20ITPUB年度最佳版主
日期:2015-03-18 15:48:48法拉利
日期:2013-12-25 19:32:35法拉利
日期:2013-12-25 17:16:47法拉利
日期:2013-12-23 21:04:09法拉利
日期:2013-12-19 14:19:27法拉利
日期:2013-12-19 07:10:24ITPUB14周年纪念章
日期:2015-10-26 17:23:44
发表于 2007-7-28 23:52 | 显示全部楼层
这种问题还是要看系统得实际情况大家一起讨论
希望达成一致

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2005-02-28 12:57:00ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58版主1段
日期:2012-05-15 15:24:11管理团队成员
日期:2013-05-02 11:18:36马上有车
日期:2014-02-19 11:55:14
发表于 2007-8-3 17:08 | 显示全部楼层

就一个数据库表的主键就火花四溅了?

夸张.小题大做

使用道具 举报

回复
论坛徽章:
0
发表于 2007-8-8 16:07 | 显示全部楼层
呵呵..
1.现在我们开发的项目是应用第二种方案..用第一种方案太经常要关联查询了..第二种只是偶尔会有更新..第三种是完全没有必要了..

使用道具 举报

回复
论坛徽章:
58
灰彻蛋
日期:2011-08-10 09:33:15娜美
日期:2017-05-11 12:19:27托尼托尼·乔巴
日期:2017-01-05 15:45:22蒙奇·D·路飞
日期:2016-06-29 21:44:39射手座
日期:2016-01-06 21:22:21复活蛋
日期:2012-12-27 13:44:16蛋疼蛋
日期:2012-12-26 12:45:33咸鸭蛋
日期:2012-11-12 12:45:43茶鸡蛋
日期:2011-12-14 21:58:27乌索普
日期:2017-08-24 16:36:02
发表于 2007-8-10 08:32 | 显示全部楼层
学习经验ing

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2006-11-23 14:13:35会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:20:52
发表于 2007-8-10 11:29 | 显示全部楼层
最初由 julyboxer 发布
[B]呵呵..
1.现在我们开发的项目是应用第二种方案..用第一种方案太经常要关联查询了..第二种只是偶尔会有更新..第三种是完全没有必要了.. [/B]


分析一下 表的主要用途有哪些?不要绝对的选择第一种或第二种方案

如果两者相结合,是不是更好?

更新多的表,用第一种方案
查询多的表,用第二种方案

第一种方案 到 第二种方案的 同步或转换的这个方案,应该不难吧

象Google 或 Baidu 这样的数据量查询,肯定是用第二种方案。
而他们的网页收集 是采用第一种方案。

如果不是两种方案相结合,收集网页时,他们会死,用户查询时,用户会慢死

关键是看你们的数据量多大。

-------------------------------------------------------------

关键在于你们的“度”是多少

Varchar(10)和Char(10)的区别 应该不大吧

如果这个表的记录,是上1000亿条呢?

Varchar(1000)和Char(10) 区别大吧
如果这个表的记录,只有10条呢?

自己把据“度”

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表