以前一直认为在一个表中应该使用代理主键而不应该使用业务主键。这个理论大多时候是正确的。但对于用户表我觉得应该使用登录名作为主键。其原因如下:
1. 方便实现日志功能。对用户信息的使用可能出现在软件的不同部分,在不同部分间通常都是传递用户表的主键来标识用户的,如果主键是代理主键则是一个无意义的数字,直接记录到日志中,必然给日志的使用代来不便,想要得到用户的登录名又必须得查询数据库。
2.用户标识在整个系统中的表达存在不一致。由于用户表使用代理主键,这样程序内部需要标识用户时通常会使用代理主键,可是系统的使用者却是以用户的登录名为自身的标识的,相关的功能自然也会以用户的登录名为标识,这样的功能在实现上是以用户的登录名为标识的,要么单独实现这样的功能,要么就不得不将用户的登录名转化为代理主键,然后去调用以代理主键为用户标识的功能。
出于以上两种原因,用户表是应该以用户的登录名为主键的。而用户的登录名的确是可以作为主键的。
注意:这里说的是用户的登录名,并不是实际姓名,它应该是不可修改的,并且是唯一的。
其它的说法:
I would suggest using the username as the primary key in the table if the username is going to be unique, there are a few good reasons to do this:
The primary key will be a clustered index and thus search for a users details via their username will be very quick.
It will stop duplicate usernames from appearing
You don't have to worry about using two different peices of information (username or guid)
It will make writing code much easier because of not having to lookup two bits of information.
出外:
http://stackoverflow.com/questions/4911/asp-net-authentication-user-name-vs-user-id
注(2011-01-16):
最近的项目要求把多个web客户端集成到一个Portal里,在Portal中统一进行用户管理,要求用户登录名可改。而我们需要嵌入的那部份的用户登录名是不可改的,必须进行调整。这样看以用户名做主键会遇问题.
分享到:
相关推荐
- UserId:作为主键,用于唯一标识每个用户,通常自增长。 - UserName:存储用户的登录名,用于身份验证。 - PassWord:保存用户的加密密码,确保安全性。 - Address:记录用户的联系地址。 - RoleId:关联用户...
- UserID:用户ID,作为主键。 - Password:用户的密码。 - Remark:用户备注。 - Status:用户状态,如激活、禁用等。 - AddDate:用户创建日期。 - CanSeeAll:是否可以查看所有信息。 9. Common_Role_User...
- `UserName`:用户登录名。 - `Password`:用户密码,用于验证登录。 - `TrueName`:用户的真实姓名。 - `LastLoginTime`:记录用户的最后登录时间。 - `UserType`:用户类型,可能有管理员、普通用户等。 2....
7. **厂商用户登录记录表**(`vendor_login_records`): - 主键:`login_id` - 字段:厂商用户ID、登录时间、IP地址等。 - 用途:记录厂商用户的登录历史信息。 8. **厂商经销商表**(`vendor_dealers`): - ...
7. **附件表**、**短消息表**、**消息接收表**、**日志表**、**文件柜文件夹表**、**文件表**、**文件柜附件表**、**图书类别表**、**图书表**、**借阅信息表**、**人员档案表**等其他表,同样包含主键、外键、非空...
1. **用户登录信息表(yonghu)**: - **ucode**:用户编号,作为主键,用于唯一标识每个用户。 - **uname**:用户名,用于验证登录,需保持唯一性。 - **upass**:用户密码,通常应加密存储,长度限制为6-12位。...
QPAccountsDB数据库中的主要表分为两个部分:用户自定义头像表(AccountsFace)和用户信息表(AccountsInfo)。 1. 用户自定义头像表(AccountsFace) AccountsFace表用于存储用户自定义的头像数据,包含以下字段:...
这个数据库名为 `users`,其中包含一个表 `userInfo`,用以记录用户的登录名(`loginName`)和密码(`passWord`)。 1. **表结构**: - **`loginName`**: 登录名,使用 `Varchar` 类型存储,长度根据实际需求设定...
- `userid`:作为主键,唯一标识每个会员。 - `username`:会员的用户名,也是主键,确保用户名的唯一性。 - `password`:会员的密码,用于身份验证。 - `telephone`:会员的联系电话,用于联系会员和确认订单。...
本系统选用MySQL 5.6作为数据库管理系统,数据库名为dbGoodsMgr,包含三个主要表格:tbAdmin(用户表)、tbCategory(商品分类表)和tbGoods(商品信息表)。 2.1 表格设计 - tbAdmin: - id:管理员编号,主键。...
- 用户ID(UserId):作为主键,自增整数,用于唯一标识每个用户。 - 用户名(UserName):存储用户的登录名,长度限制为50个字符,不可为空。 - 密码(PassWord):保存用户密码,同样长度为50个字符,不可为空,通常...
- **UI_LOGINNAME**:登录名,用户登录系统时使用的名称。 - **UI_PASSWORD**:密码,存储形式为MD5加密,增强安全性。 - **UI_IP**:用户IP地址,记录用户最后一次登录或当前连接的IP。 - **UI_IDENTITYE**:用户...
用户表(T_rUser)是系统的核心,它包含了用户的登录信息。表中的字段包括: - UserID:主键,标识用户ID,类型为int。 - UserName:用户名称,类型为varchar(20),不允许为空。 - UserPwd:用户密码,类型为varchar...
序列在Oracle中用于生成唯一的整数,通常作为主键的值。例如,创建两个序列`U_seq`和`U_order`: ```sql CREATE SEQUENCE U_seq MINVALUE 1 MAXVALUE 10000 START WITH 1 INCREMENT BY 1 CACHE 20; CREATE ...
- `QQId`:这是每个用户在系统中的唯一标识,作为主键,通常用于关联其他表。 - `Username`:用户设置的昵称,非空,用于显示。 - `Password`:用户登录密码,非空,一般经过加密存储以确保安全性。 - `Sex`:...
- `U_ID`:作为主键,标识每个用户的唯一身份,自增确保每次插入新用户时自动增长。 - `U_LoginID`:用户登录时使用的账号,通常用于身份验证。 - `U_NickName`:用户在聊天软件中的昵称。 - `U_PassWord`:用户...
- **UserId**:作为主键,标识唯一用户,自增确保了唯一性。 - **UserName**:用于存储用户的登录名,通常是邮箱或手机号。 - **PassWord**:保存用户密码,通常在实际应用中会进行加密存储。 - **Address**:...
- 用户表:这是系统的基础,包含用户的基本信息,如登录名、登录密码、真实姓名、性别、出生日期、民族、学历、职称、电话、地址和邮箱。这些信息是用户身份验证和个性化服务的关键。 - 联系人表:存储用户的好友...
1. **部门表**:包含部门号、部门名、主管员工号、联系电话和邮箱号。 2. **员工表**:包括员工号、姓名、职位、联系方式和薪资,职位字段可以设定为主管、业务员、策划员等。 3. **用户表**:用户号作为主键,记录...
本项目采用经典的Java Web技术栈——JSP(JavaServer Pages)、JavaBean与Servlet,构建了一个简单的用户登录与注册系统。这些技术在2010年前后非常流行,并且至今仍被广泛应用于企业级应用开发中。 #### 二、...