一个主键设计的问题

hztltgg 2011-09-13 10:17:11
如果一个主键是多个字段构成,
比如老师带学生,学生不会重复
teacherid studentid ...
这样的话,主键可以用这两个字段构成,如果还有第几期的概念的话,可能还要三个字段构成。

这样和这个表关联的其他表,字段就非常多了,比如成绩表,teacherid studentid type score。使用起来很不方便,每次传递参数的时候都要一大串。

但如果用id来表示主键的话,是不是又不符合范式了呢?
id teacherid studentid ...
id type score

id 和teacherid studentid 代表同一个东西了。为了防止teacherid studentid 重复,还要建立唯一索引了
...全文
108 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycodeis0000 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qianjin036a 的回复:]
从数据库应用来看,主键设置的主要目的是为了检索方便,而并非唯一性.

一般说来,你的表中数据的唯一性并非数据库来限制的,而是由你程序的业务层来限制的.比如,想要插入某一学号的学生到学生表中去,并非插入操作进行时,由数据库返回"该学号已存在"类似的信息而找出插入错误的,而是由业务层到学生表中去查询,发现有这个学号,然后执行相关的程序,来提示或修正出错的操作.
由此,你的主键大可不必用两个字段或……
[/Quote]

我同意9楼的~最好不要设置外键 外键在业务中处理就OK了
我看了金蝶K/3系统 基本是不设外键的~因为表很多的时候设外键 操作起来会很头痛
hztltgg 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mingpei0703 的回复:]
引用 2 楼 fredrickhu 的回复:
这个是表结构设计的问题

你可以拆分这个表来满足范式嘛

再说表结构设计的时候是尽量满足范式

也是允许有冗余的

恩,这种情况一般都是将表拆分开来,如:teacher表 student表,这样teacherid studentid 就便于设为主键
[/Quote]

teacher表 student表是存放基础信息的吧,现在是选课表
teacherid studentid 作为选课表的主键

然后又有成绩表
这时选课表的teacherid studentid 和课程又一起组成主键。

如果成绩表还分单项成绩,选择题几分,填空题几分,还要加一个表,他的主键变成
teacherid studentid 课程 题目类型

这样主键不是越来越长了么?
mingpei0703 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
这个是表结构设计的问题

你可以拆分这个表来满足范式嘛

再说表结构设计的时候是尽量满足范式

也是允许有冗余的
[/Quote]
恩,这种情况一般都是将表拆分开来,如:teacher表 student表,这样teacherid studentid 就便于设为主键
HL 2011-09-13
  • 打赏
  • 举报
回复
实用就行,比好看不好用好的多了.
三断笛 2011-09-13
  • 打赏
  • 举报
回复
你这个ID是代理键.据说这个东东的存在是比较有争议的.
唯一索引还是要建立的.
如楼上所说,没啥范式不范式的,对于OLTP来说,重要的是高效,方便.
AcHerat 元老 2011-09-13
  • 打赏
  • 举报
回复
你可以让那3个字段做联合主键,加个id做标识,其他表用这个表的id,但不建立外键。
xuam 2011-09-13
  • 打赏
  • 举报
回复
学期,teacherid, studentid 3个字段做主键就OK
--小F-- 2011-09-13
  • 打赏
  • 举报
回复
这个是表结构设计的问题

你可以拆分这个表来满足范式嘛

再说表结构设计的时候是尽量满足范式

也是允许有冗余的
NBDBA 2011-09-13
  • 打赏
  • 举报
回复
这个范式不是绝对的,加ID主要是为了关联方便
设计并不一定是范式要求,也有反范式的要求
-晴天 2011-09-13
  • 打赏
  • 举报
回复
从数据库应用来看,主键设置的主要目的是为了检索方便,而并非唯一性.

一般说来,你的表中数据的唯一性并非数据库来限制的,而是由你程序的业务层来限制的.比如,想要插入某一学号的学生到学生表中去,并非插入操作进行时,由数据库返回"该学号已存在"类似的信息而找出插入错误的,而是由业务层到学生表中去查询,发现有这个学号,然后执行相关的程序,来提示或修正出错的操作.
由此,你的主键大可不必用两个字段或者更多的字段来组成,在我做的所有大大小小应用中,从来没有出现过多字段合成主键的.因为没必要.
更有甚者,我做的应用中基本没有设置过外键,为什么?因为,主外键的限制其实也应该在业务层中现实现.

主键,通常就是一个ID.

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧