实际项目中外键,应该用"userid"(账号)还是用user表"ID"

本文探讨在外键选择中使用用户ID还是账号ID,并分析两者优缺点。介绍在不同项目规模下选择逻辑ID或物理ID的原因及分布式环境下逻辑ID的优势。同时提供了一些数据库性能优化的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际项目中外键,应该用"userid"(账号)还是用user表"ID"




表"ID"好处:

用id因为是int类型,比字符串类型的性能高得多,特别是在大数据量的情况下。在数据库的设计上,除非非常高级的系统,才会考虑int快和慢的问题。


"userid"(账号)

如果数据量比较大,有的情况下需要考虑尽量减少表连接的操作


这种情况我们一般叫“逻辑id”和“物理id”


userid------作为数据的物理id标识

用户名---------是数据的逻辑id


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

而大型项目往往使用逻辑id做标识


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


比如:银行系统通常使用不与数据库id关联的,账户号做标识。而电信系统则因为硬件环境的限定使用电话号码做标识(电信系统通常的前置机只认主叫号,被叫号这种逻辑标识,而不认你自己的数据库id)


优化方案:

为了提高性能可以作数据冗余。例如:字段比较多,数据量又很大,你可以把Name字段上加入包含性列(不过这会占用一点额外的存储空间了)

可能修改的账号字段定义为loginid,用户表使用id,userid,作为标识。 UserName修改的机会要大很多,特别是企业应用,客户如果要求改一下用户名,如果用户名是外键那影响就大了.



相关话题:

外键约束会影响数据库性能,所以考虑只作业务约束。

表连接也有技巧:尽量用left join,不用inner join,这样可以提高效率

一个同事认为3次表连接以上就很可能会有性能问题

单机的情况下,4次表连接,主表20万行,在E8400+2G的机器上,做Group By统计,运行时间超过半个小时.后来将3个表连接保存为一个视图,再与主表连接,问题解决,30秒内完成.(不知道用的什么数据库,我不太信)


转载于:https://my.oschina.net/u/2438634/blog/511512

请生成一个汽车展览销售系统的数据库E-R图,包含以下实体及关系: 1. **实体与属性** - **用户 (User)** - 主:用户ID - 属性:账号、密码、姓名、性别、手机、头像 - **车辆信息 (Vehicle)** - 主:车辆ID - 属性:车辆名称、价格、库存、排量、变速箱类型 - 外:品牌ID(关联品牌)、类型ID(关联车辆类型) - **品牌 (Brand)** - 主:品牌ID - 属性:品牌名称 - **车辆类型 (VehicleType)** - 主:类型ID - 属性:类型名称 - **订单 (Order)** - 主:订单ID - 属性:购买数量、金额、是否支付 - 外:用户ID(关联用户)、车辆ID(关联车辆信息) - **评论 (Comment)** - 主:评论ID - 属性:评分、评论内容 - 外:用户ID(关联用户)、车辆ID(关联车辆信息) - **收藏 (Favorite)** - 主:收藏ID - 外:用户账号(关联用户)、车辆ID(关联车辆信息) 2. **实体间关系** - **用户 ↔ 订单**:1个用户可创建多个订单(1:N) - **用户 ↔ 评论**:1个用户可发多条评论(1:N) - **用户 ↔ 收藏**:1个用户可收藏多辆车辆(1:N) - **车辆信息 ↔ 品牌**:1个品牌对应多辆车(1:N) - **车辆信息 ↔ 车辆类型**:1个类型对应多辆车(1:N) - **车辆信息 ↔ 订单**:1辆车可被多次购买(1:N) - **车辆信息 ↔ 评论**:1辆车可有多条评论(1:N) 3. **格式要求** - 主用 🔑 标记,外用 → 标注指向的。 - 关系线标注“1:N”或“多对一”。 - 用户用蓝色,车辆用绿色,订单用橙色,品牌/类型用灰色。
03-18
现在我已经使用代码生成,做出了学生信息管理界面。 目前的有下面这些问题等待解决: 1.无法添加学生,我怀疑是因为学生信息使用user_id作为外。若依代码生成没有考虑到这一方面。所以添加学生信息的功能需要修改,加上对sys_user的修改。 – Table structure for sys_user DROP TABLE IF EXISTS sys_user; CREATE TABLE sys_user ( user_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘用户ID’, dept_id bigint(20) NULL DEFAULT NULL COMMENT ‘部门ID’, user_name varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘用户账号’, nick_name varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘用户昵称’, user_type varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘00’ COMMENT ‘用户类型(00系统用户)’, email varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘用户邮箱’, phonenumber varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘手机号码’, sex char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘0’ COMMENT ‘用户性别(0男 1女 2未知)’, avatar varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘头像地址’, password varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘密码’, status char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘0’ COMMENT ‘帐号状态(0正常 1停用)’, del_flag char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘0’ COMMENT ‘删除标志(0代存在 2代删除)’, login_ip varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘最后登录IP’, login_date datetime NULL DEFAULT NULL COMMENT ‘最后登录时间’, create_by varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘创建者’, create_time datetime NULL DEFAULT NULL COMMENT ‘创建时间’, update_by varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ‘’ COMMENT ‘更新者’, update_time datetime NULL DEFAULT NULL COMMENT ‘更新时间’, remark varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ‘备注’, PRIMARY KEY (user_id) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ‘用户信息’ ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 对sys_user的操作包括但不限于,创建角色账号为学生学号、创建密码为学生学号、性别设置为学生的性别、分配用户角色为students等操作。 问题2,因为是单查询,所以页面显示的是学院id、班级id,搜索功能也是学院id、班级id搜索。所以我需要关联学院和班级。使得页面单项展示的是学院名和班级,搜索也是输入学院或班级搜索。 请给出步骤
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值