【问题标题】:Database design question (conditional mandatory fields)数据库设计问题(有条件的必填字段)
【发布时间】:2009-11-07 17:47:10
【问题描述】:

只是寻找一些关于如何最好地做到这一点的意见/想法。

我正在构建一个由管理员手动添加用户的外联网系统(某人无法“注册”自己)。当他们被添加时,只输入了少量的强制性数据(姓名、电子邮件、密码),然后通过电子邮件将他们的登录信息发送给他们,当他们第一次访问系统时,他们会被要求提供额外的强制性详细信息,这些信息必须在被给予之前完成访问整个网站。

我可以想到三种在数据库中定义它的方法:

  1. 将所有必填字段设置为 NOT NULL 在数据库中,并输入空字符串 对于所有“有条件 必填”字段创建时 用户(我不喜欢这个,似乎 哈克)

  2. 仅设置初始强制 数据库中的字段不为空,并且 为所有的输入 NULL “有条件的强制性”字段 创建用户时(我不喜欢 这虽然在技术上是正确的,但 架构不会反映真实的 世界用户实体,其中所有 数据是强制性的)

  3. 有两张表,一张给新用户, 和一个完整的用户(起初 乍一看这似乎是最好的 选项,但是其他表需要 有指向 用户表,这将 使事情复杂化/使事情变得不可能)

有什么想法吗?
干杯,
杰克

编辑

所以看起来 2 号将是最好的方法,使用定义记录状态(新/完整)的字段以及检查约束或触发器来检查是否所有“可选强制”字段都有价值。我猜检查约束将是最合适的选择,但我会试一试,看看哪个效果最好。谢谢。

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    如果您尝试第二个但添加一个字段以将状态显示为已初始化、完全注册。然后字段可能为空,但当值更改为完全注册时,触发器可以确保填写所有必填字段。

    【讨论】:

      【解决方案2】:

      我会选择一个表的实用方法,用一个状态列来指示用户是“私人”还是“确认”(比如说),并检查约束以确保在状态为“已确认”。

      到底该用null还是空字符串,我没有太多意见,因为我习惯了Oracle,无法区分这两者!

      【讨论】:

      • 虽然我认为检查约束是最好的选择,但看起来 MySQL 不支持它们 :-( ,所以必须改用触发器。
      【解决方案3】:

      我会选择选项 3。这是假设系统不会对“新用户”执行任何操作,除非等待他们转换为“完整用户”。

      有一个 newusers 表,其中包含最少数量的必填字段。在用户转换为完整用户时设置与其他表的任何关系,而不是在创建新用户时。这将消除建立与 newusers 和 users 表的关系的需要(您只需要它们用于 users 表)。

      【讨论】:

      • 不幸的是,系统确实对新用户进行处理,其他表与用户表有关系,并且拥有两个用户表会使这变得复杂/不可能。
      【解决方案4】:

      有点笨拙,但您可以为新用户和注册用户设置一张桌子。一旦用户注册,他们就会从新用户表中删除,所有数据都在注册用户表中。要访问整个站点,必须在注册用户表中。新的用户表仅用于允许访问注册页面。

      【讨论】:

      • 问题在于其他表与用户表有关系,并且拥有两个用户表会使这变得复杂/不可能。
      猜你喜欢
      • 2021-08-27
      • 2016-05-22
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2018-01-31
      相关资源
      最近更新 更多