经验帝入。外键该用"用户ID"还是"用户名"?

fihuang 2010-08-01 04:11:46
我看过的科班的sql教材都是用"用户ID"做外键,但是在实际应用中需要用到是用户名,用"用户名"做外键有什么不妥吗?
诚心请教有经验的前辈,你们在实际项目中,碰到这样的情况是怎么处理的?是用UserID还是UserName或者两个一起用?
...全文
2653 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
jointan 2010-08-03
  • 打赏
  • 举报
回复 1
如果UserName不能修改的话,还是UserName做外键吧,如果你的UserID不起任何可能影响日后排序功能的话,建议,删除该字段,没什么用.
xinv19shi 2010-08-03
  • 打赏
  • 举报
回复
UserID
fihuang 2010-08-03
  • 打赏
  • 举报
回复 1

再说明一下,UserID和UserName都是唯一的,UserName一旦注册以后将不能修改。

大家再看看用哪一种方式比较好:
1.一个字段:UserID做外键,通过表连接或者查询两次。
2.一个字段:UserName做外键。
3.两个字段:UserID做外键,增加UserName字段。
4.两个字段:UserID和UserName都做外键。



我觉得应该选择方案3. 大家怎么看?
daone 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fdh120 的回复:]
引用 4 楼 fihuang 的回复:
用户ID是唯一,用户名也是唯一的。为何楼上的都说用UserID
如果用UserID,每次都要通过UserID去获取UserName,这样很耗资源;如果UserID和UserName一起用的话,就不符合数据库表设计的基本原则。

用户ID和用户名都唯一,那你用户表里只保存其中一个字段不就完了,为什么还设两个字段?不感觉有点多余吗??
[/Quote]
用户名可能出现变动,但用户ID是不变的
mac_uestc 2010-08-02
  • 打赏
  • 举报
回复 1
[Quote=引用 7 楼 fdh120 的回复:]

引用 4 楼 fihuang 的回复:
用户ID是唯一,用户名也是唯一的。为何楼上的都说用UserID
如果用UserID,每次都要通过UserID去获取UserName,这样很耗资源;如果UserID和UserName一起用的话,就不符合数据库表设计的基本原则。

用户ID和用户名都唯一,那你用户表里只保存其中一个字段不就完了,为什么还设两个字段?不感觉有点多余吗??
[/Quote]

就像你有身份证了为什么不把名字丢掉....砖一个
hwbox 2010-08-02
  • 打赏
  • 举报
回复 1
一般都是用ID,用户名有时候会有改动。比如老板叫李明,他的用户名叫liming用了两个月,老板把你叫来了“老让我输这么长,给我改成lm!”
sxldfang 2010-08-02
  • 打赏
  • 举报
回复 1
id与用户名相比:
------------------
id操作快
id长度较用户名少
传id参数较方便
libinlink 2010-08-02
  • 打赏
  • 举报
回复 1
千万不要用用户名做外键。

重名的话,难道你要人家改名?
PalmerWang 2010-08-02
  • 打赏
  • 举报
回复
那就直接UserName做外键啊,有没有什么冲突,只要是唯一的就行
fihuang 2010-08-02
  • 打赏
  • 举报
回复
大家都说了这么多,我很矛盾,下面的3种选择真的不知道该怎么选。
3选1:
1.UserID做外键,通过表连接或者查询两次。
2.UserID做外键,但是增加一个UserName字段。
3.UserName直接做外键,删除UserID字段。
fihuang 2010-08-02
  • 打赏
  • 举报
回复
再说明一下,UserID和UserName都是唯一的,UserName一旦注册以后将不能修改。

大家再看看用哪一种方式比较好:
1.UserID做外键,通过表连接或者查询两次。
2.UserID做外键,但是增加一个UserName字段。
3.UserName直接做外键,删除UserID字段。
soaringbird 2010-08-02
  • 打赏
  • 举报
回复
用户名有时候需要复用,在历史上可能不唯一
Thr21ough 2010-08-02
  • 打赏
  • 举报
回复
毫无疑问应该用ID
leiziaitudou 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]
为关联字段创建外键
所有的键都必须唯一
避免使用复合键
外键总是关联唯一的键字段
[/Quote]
用户id应该是标识列 所以不会重复
边城的刀声 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fihuang 的回复:]

用户ID是唯一,用户名也是唯一的。为何楼上的都说用UserID
如果用UserID,每次都要通过UserID去获取UserName,这样很耗资源;如果UserID和UserName一起用的话,就不符合数据库表设计的基本原则。
[/Quote]
在数据量少的时候,可以遵循规范。
但在现在的Web下,大数据量的情况下,冗余也是好的,要不然就象你说的会很耗资源
mill_dhl 2010-08-02
  • 打赏
  • 举报
回复
用户名一般可以是字符串的,做主键进行判断的时候比较麻烦,所以一般用ID做主键
wanghui0380 2010-08-02
  • 打赏
  • 举报
回复 1
这种情况我们一般叫“逻辑id”和“物理id”

userid------作为数据的物理id标识
用户名---------是数据的逻辑id

一般来说中小型项目通常使用物理id做为标识
而大型项目往往使用逻辑id做标识

区别,大型项目因为数据量大,结构复杂,网络硬件配置复杂,网络结构复杂,存储介质复杂。他们通常采用分布式的数据存储介质和分布式的网络环境,而在分库,分表的情况下,数据库的物理id就不可预览了,所以更多情况下使用逻辑id作为标识

比如:银行系统通常使用不与数据库id关联的,账户号做标识。而电信系统则因为硬件环境的限定使用电话号码做标识(电信系统通常的前置机只认主叫号,被叫号这种逻辑标识,而不认你自己的数据库id)
porschev 2010-08-02
  • 打赏
  • 举报
回复
用主键ID。。。。。。。
hyblusea 2010-08-02
  • 打赏
  • 举报
回复
新建一个与业务逻辑无关的主键字段,作为外键
isaced 2010-08-02
  • 打赏
  • 举报
回复
id!!!!!!!!!!
加载更多回复(35)
1. 普通用户表(users) 字段名称 类型 记录内容 是否为空 备注 user_id Varchar2(50) 用户 0 主键 password Varchar2(20) 密码 0 name Varchar2(20) 用户姓名 1 telephone Varchar2(20) 固定电话 1 mobile Varchar2(20) 手机 1 address Varchar2(100) 用户地址 1 email Varchar2(50) Email 1 管理员表(administrators) 字段名称 类型 记录内容 是否为空 备注 admin_id Varchar2(50) 用户 0 主键 password Varchar2(20) 密码 0 id_number Varchar2(20) 身份证号 0 name Varchar2(20) 管理员真实姓名 0 telephone Varchar2(20) 固定电话 1 mobile Varchar2(20) 手机 0 address Varchar2(100) 管理员家庭地址 0 email Varchar2(50) Email 0 登录表(login) 字段名称 类型 记录内容 是否为空 备注 id Varchar2(20) 用户 0 主键 password Varchar2(20) 密码 0 订单表(order) 字段名称 类型 记录内容 是否为空 备注 auto number 序号 0 主键,自增长 order_id Vachar2(100) 订单编号 0 user_id Varchar2(20) 用户id 0 外键(用户表) ticket_id Varchar2(40) 票编号 0 外键(票务信息) time Date 下单时间 0 票务信息(tickets) 字段名称 类型 记录内容 是否为空 备注 ticket_id Vachar2(100) 机票编号 0 主键 airline Varchar2(50) 所属航空公司 0 外键(航班信息) filght_number Varchar2(50) 航班号 0 外键(航班信息) cab Varchar2(50) 舱位类型 0 pirce number 舱位对应价格 0 外键(航班信息) 航班信息表(flight_info) 字段名称 类型 记录内容 是否为空 备注 filght_number Vachar2(30) 航班号 0 由航空公司提供,主键 start_time Varchar2(40) 出发时间 0 end_time Varchar2(40) 到达时间 0 range_type Varchar2(10) 往返类型 0 单程,往返 departure Varchar2(40) 始发地 0 destination Varchar2(40) 目的地 0 airline Varchar2(30) 航空公司 0 price number 机票基础价格 0 用户操作记录表(deal_log) 字段名称 类型 记录内容 是否为空 备注 auto number 用户编号 0 主键,自增长 user_id Varchar2(30) 用户id 0 外键(普通用户) op_type Varchar2(40) 操作类型 0 订票,退票,改签 ticket_id Varchar2(40) 机票编号 0 外键(票务信息) time Varchar2(10) 时间 0
图书馆系统数据库结构设计 组名:第三组 组员: 组长: 组员: 数据库功能: 本系统的主要目标是使用它的管理用户,包括系统管理员、普通用户,能很好的管理书籍库存工作,以及相应书籍的查询工作。比如管理员负责图书的日常管理工作,如各种基本信息的录入、修改、删除、查询操作以及动向查询,普通用户可以进行借阅前的查询。该系统包含图书的查询,图书的删除,图书的增加。借书,还书等功能。 数据库运行流程图: 数据库结构设计: 表一:学生信息表(电话号码,密码,姓名,学生id) 图书馆系统数据库结构设计全文共3页,当前为第1页。 主键:学生id 图书馆系统数据库结构设计全文共3页,当前为第1页。 外键:无 存储内容:学生的基本信息 表二:图书信息表(图书简介,图书数量,图书名称,图书id,图书价格,出版社信息,作者姓名,印刷版次,图书类型) 主键:图书id 外键:无 存储内容:图书的基本信息 表三:用户类型表(类型id,类型名) 主键:类型id 外键:无 存储内容:登陆用户的类型 表四:借书表:(用户id,图书id,借阅时间,归还时间,续借与否) 主键:用户id,图书id,借阅时间 外键用户id,图书id 存储内容:图书借阅的基本信息 用户信息表 用户类型 Sortname 空"非空 用户ID Uid N 用户 UName N 用户密码 Pwd N 电话 Phone Y 图书馆系统数据库结构设计全文共3页,当前为第2页。书籍信息表 图书馆系统数据库结构设计全文共3页,当前为第2页。 图书ID BookID 空"非空 图书名称 BookName N 图书数量 BookNum N 图书简介 BookRemark N 图书价格 BookPrise N 出版社信息 … N 作者姓名 Name N 印刷版次 … N 图书类型 BookStyle N 用户类型表 用户类型 Sortname Varchar(50) 借书表 用户ID Uid 空"非空 图书ID BookID N 借阅时间 DateTime N 归还时间 DateTime N 是否续借 ReLend N 设计分工及各自完成情况: 一起想一起设计出来的 研讨次数,地点,内容和总结: 研讨了好多次,地点是在寝室,我们四个一个寝室,没事就讨论怎么做这个作业,慢慢的从无从下手到有了一点头绪,最后终于完成了今天的成品。总结来说从这个文档的制作中学到了挺多的东西,从网上的成熟文档中有一些借鉴,但他们写的也有瑕疵,我们就做了一些补充和修改。最后那个表格可能不符合标准,因为老师给的文档没能打开,所以不知道怎么做,他的表格是用来程序编写的,所以肯定会有出入,我们会在今后作出更正。东西是第一次做,肯定有做的不好的地方,但我们愿意秉着这个思路,在今后的学习中不断完善自己的作品,希望以后能有更大的收货。 图书馆系统数据库结构设计全文共3页,当前为第3页。 图书馆系统数据库结构设计全文共3页,当前为第3页。 图书馆系统数据库结构设计

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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