【问题标题】:How to represent a set of values in a relational database如何在关系数据库中表示一组值
【发布时间】:2013-05-07 14:40:05
【问题描述】:

假设我有一组某个类别的值,例如体育活动。

这些值可能是:

  1. 正在运行
  2. 篮球
  3. 足球
  4. 冰球
  5. 步行
  6. 棒球
  7. 篮球

现在假设我有一大群人。每个人在一年中的每个季节都参加一系列体育活动。所以A人可能在冬天打篮球和跑步,在春天和夏天打棒球和跑步,在秋天踢足球和跑步。 B 人可能在春、秋、夏步行和跑步,在冬天打篮球和冰球等等。

换句话说,每个人都有 4 组(或数组)体育活动(称为最喜欢的景点活动),每个季节一个。

我试图找出将这些值集有效地映射到关系数据库中的个人的最佳方法。我假设我将有一张人桌和一张体育活动桌。但是我如何表示来自体育活动表的重叠值集并将它们映射到人员表中的个人?

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    您将活动映射到一个人。您的表将引用活动和人员,主键将是这两者的组合。

    person <----- personActivity -----> activity
    

    如果你想添加季节:

    person, activity, season
    
    personActivitySeasn
    

    【讨论】:

    • 但是如果一个人在几个不同的季节进行相同的活动,则可能会多次映射相同的活动。我不明白你是如何表示这一点的。
    • 按照 FreshPrinceOfSO 的建议,您可以在第三张表中使用三列(人、活动、季节)创建复合键。
    • @Elliott 见this demo。您需要设置外键。
    【解决方案2】:

    您还会有一个季节表(可能只有四个值)。然后你会有一个表PersonActivitySeasons,列如下:

    • PersonActivitySeasonId
    • 人员标识
    • 季节编号
    • 活动 ID
    • 活动日期

    这是最标准化的格式。在实践中,您还可以制作季节列:

    • PersonActivitySeasonId
    • 人员标识
    • 活动 ID
    • 是冬天
    • 是春天
    • 是夏天
    • 是秋天

    我倾向于采用第一种方法,因为我可以为每个季节的每条记录包括有效日期和结束日期,并且更容易跟踪人们进出活动。此外,如果这对您有用的话,它将允许“不合规”的季节。

    【讨论】:

    • 我不建议第二种方法;即使因为活动日期只有 4 个季节。
    【解决方案3】:

    您可以创建第三个表“Activity”,其中包含 Person id(个人表中的 PK)和运动 id(运动表中的 PK)。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2010-09-06
      • 1970-01-01
      • 2014-08-18
      相关资源
      最近更新 更多