当前位置: 首页 > 知识库问答 >
问题:

在DBMS中高效地存储昵称和psswrd

费秦迟
2023-03-14

你会选择以下两个选项中的哪一个?为什么?

备选方案1:

Customer -> CustomerID_PK, DateOfBirth, Address, Username, Password

备选方案2:

Customer -> CustomerID_PK, DateOfBirth, Address
CustomerInfos -> CustomerID_PK, Username, Password

您不知道经理存储每个客户以前的所有用户名和密码是否重要。您只知道每个客户可以随时更改他的密码和他的昵称。不管安全方面,您会遵循哪种方法?

共有1个答案

常英资
2023-03-14

设计良好的数据库是物理世界相当好的模型。所以,在决定像你这样的问题时,想想世界上发生了什么。

您在这里的实体是客户。客户应该具备哪些属性?哪些属性本质上属于每个客户?客户是自然人,因此每个人都有唯一的出生日期。在您的系统中,每个客户只有一个用户名和密码。所以这些是显而易见的属性。

  • 用户名
  • 密码
  • 出生日期

您还可以决定您的客户可以只有一个地址。或者,也许一个客户可以根据您的业务规则拥有多个地址(家、办公室?)如果您选择“恰好一个地址”业务规则,则地址也是您的客户实体的属性。如果不是,则有一个名为Address的单独实体,如下所示。(类型为'home'、'office'等)。

(address_id PK, customer_id FK, type, address)

如果需要为客户存储以前的用户名/密码组合,则需要一个单独的凭据实体。每个客户将拥有一个或多个凭据。因此凭据表如下所示。

(credential_id PK, customer_id FK, username, password, effective_date)

无论如何,为了数据工程的清晰性,您应该使用一个表来存储一个实体。因此,我建议方案1。

这是一个切实可行的建议。模式只会随着时间的推移增加更多的表,因此避免额外的表是很好的。包含具有相同代理(自动递增)主键的多个表的模式更难理解和维护,而且那些额外的表是不必要的。

例外情况:您已经有数百万客户,您需要添加更多的属性,但是您负担不起重新组织表和添加列的停机时间。

 类似资料:
  • 问题内容: 您将如何解决以下存储和检索问题? 每天(每年365天)将添加大约2.000.000行,每行包含以下信息: id(唯一的行标识符) entity_id (取值介于1到2.000.000(含)之间 date_id(每天增加一次-取值范围为1到3.650(十年:1 * 365 * 10)) value_1(取值范围在1到1.000.000之间(包括1和1.000.000之间) value_2

  • 昵称 可变更初始设定时选择的昵称。

  • 因为合约的名字是一个很长的哈希值,不容易辨认和记忆。 平台提供了昵称功能,可以为合约注册昵称。且可以注册查询页面和操作页面,更加方便用户执行合约。昵称功能是由合约c514cb497286b0ff206c6fae74634f6f546f43fab823fd87bf6fcb1616ce9665提供。 注册完昵称后,可以注册查询页面和操作页面 查询页面:用于查询已经存在数据库中的数据,并将其显示在页面上

  • 接口说明 修改当前登录用户的昵称 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/user/1.0.0/updateNickName 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 nickName string form 是 昵称/姓名 响应字段说明 无 响应成功示例 { "code": 200

  • 设置设备昵称前缀名 参数说明 字段 类型 必须? 说明 name String 否 重要:设备nick前缀,如果想要设定设备前缀名,一定要在获取设备列表之前设置该前缀; 如果不设定将是默认设备前缀名:Rokid。 也可以通过更新设备昵称修改 接口定义 Swift: RokidMobileSDK.device.setInitDeviceNickPrefix(name:"XXX") Objc: [

  • 更新设备的昵称 接口说明 更新当前设备的昵称 参数说明 字段 类型 必须? 说明 deviceId String 是 设备ID newNick String 是 新设备名称 示例代码: RokidMobileSDK.device.updateNick(deviceId, newNick, new IUpdateNickNameCallback() { @Override publ