【问题标题】:SQL structure for holding arrays?用于保存数组的 SQL 结构?
【发布时间】:2011-10-31 00:58:56
【问题描述】:

如何将一个表与另一个表中的多条记录关联起来?

基本上,我有一个“事件”表,我如何跟踪特定事件中的哪些“用户”(在他们自己的单独表中)?现在,我在“事件”表中只有一个列,其中包含加入该“事件”的用户 ID 的逗号分隔列表。

一定有更好的方法来做到这一点......对吧?

【问题讨论】:

    标签: php sql multidimensional-array


    【解决方案1】:

    通常,您有一个名为users_in_event 的表,它为每个用户保存一行,与events 表具有多对多关系。因此,对于每个事件,您将有许多表行分别映射到用户。

    CREATE TABLE users_in_event
    ( 
      user_id INT,
      event_id INT,
      FOREIGN KEY user_id REFERENCES users (user_id) ON UPDATE CASCADE,       
      FOREIGN KEY event_id REFERENCES events (event_id) ON UPDATE CASCADE
      -- Optionally, use ON DELETE CASCADE for the events foreign key
      -- FOREIGN KEY event_id REFERENCES events (event_id) ON UPDATE CASCADE ON DELETE CASCADE
    )
    

    要找出哪些用户参加了活动,请执行以下操作:

    SELECT 
      users_in_event.user_id,
      users.name
    FROM users JOIN users_in_event ON users.user_id = users_in_event.user_id
    WHERE event_id=1234;
    

    【讨论】:

    • 啊,好吧,有道理。非常感谢。
    • 你的 SQL 是一个更好、更完整的例子,但值得注意的是它是多对多的关系,而不是一对多的关系。如果是一对多,那么一个活动可以有很多用户,但每个用户只能参加一个活动,在这种情况下,更直接的表示关系的方法是在“多”一侧放置一个字段,例如,一个事件有很多用户,所以users 表将有一个event_id 列。
    【解决方案2】:

    如果您有一个多对多的关系,即用户可以参加许多活动,并且活动可以由许多用户参加,传统上这将用一个映射表来表示,其中每个表的主键,加上任何特定于用户事件关系的属性。

    例如,如果您的 USEREVENT 表中的 ID 列都是 INT 类型:

    CREATE TABLE USER_EVENT_MAPPING
    (
        USER_ID INT,
        EVENT_ID INT
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多