【问题标题】:Autoincrement ID with a prefix带前缀的自动增量 ID
【发布时间】:2013-12-15 20:48:52
【问题描述】:

我正在设计一个表“员工”,其中包含一个自动递增的主键并表示员工的 ID。

我想在 ID 前加上一个指定城市的数字:城市 1:1、城市 2:2 等。

因此 ID 应该类似于 xyy,其中 x 代表城市,yy 代表员工的 ID。

当我添加新员工时,我选择了城市 x,我希望 yy 值自动递增。

这可以使用 SQL 命令吗?

【问题讨论】:

  • 它被称为关系是有原因的,是什么阻止你添加城市列?
  • 不要在您的架构中执行此操作。只需使用身份。您可以生成代理键作为显示 ID 的值。
  • 天堂帮助你第 11 个城市的员工。
  • 员工换城市会怎样?
  • ID 是否应该是唯一的单独(正如您使用术语“自动增量”所暗示的那样,它在数据库上下文中具有非常具体的含义),或者不是?例如可以同时存在“NewYork23”和“Boston23”吗?

标签: mysql sql database-design


【解决方案1】:

那不是好的数据库设计。你真的应该在你的表中有一个单独的城市列。如果您有许多城市,则这些城市可能应该在它们自己的表中。您正在尝试做的事情过于复杂,尽管“一切皆有可能”,但我不会推荐它。

【讨论】:

  • “城市或许应该在他们自己的桌子上” --- 更进一步并通过数据中心将它们分开怎么样?每个数据中心一个城市。听起来不错吧?
  • 当然,如果这是您的数据结构所需要的。我想说满足 BCNF 通常是一个足够好的目标。有些数据库需要更多的标准化,有些则更少。
  • 我可能会分离城市,并使用串联主键。
  • 我个人认为在对新手说“为每个条目创建一个单独的表”时不会造成破坏。将相同类型的实体存储在单个表中是否有什么特别错误的地方?
  • @user2703038:你为什么想要一个串联的PK?如果您需要更人性化的内容,请不要使用自动增量 PK,并创建一个辅助 UNIQUE 列。
【解决方案2】:

您实际上是将两个字段打包为一个,并且在此过程中违反了atomicity 和1NF 的原则。最重要的是,您的密钥不是最小的(可以这么说)。

相反,保留两个单独的字段:ID 和 CITY。

ID 单独 是主键。用您自己的话来说,ID 是自增的,所以它本身就是唯一的。

您可以轻松地将concatenate ID 和 CITY 一起用于在查询或 VIEW 甚至客户端代码中显示。没有理由在表本身中“预煮”连接值。

【讨论】:

    【解决方案3】:

    鉴于 cmets 的这个要求,“唯一 ID 应该为用户提供城市信息,公司要求”,我会这样做。

    表employee 会有一个employeeID 作为主键。其他字段包括名字、姓氏、生日、性别等

    table city 会有一个 cityId 作为主键。其他字段可以是城市、省州、国家/地区的名称,只要合适。

    表 EmployeeCity 会有一个主键 EmployeeId、CityId 和 StartDate。 EndDate 字段不是主键的一部分。

    EmployeeCity 的主键满足唯一标识符的要求,从而导致城市信息。此外,如果员工更换城市,只需更新一条记录并添加另一条记录即可。

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多