理解与外键和主键的N:M关系?

时间:2015-02-22 11:04:07

标签: mysql database-design relational-database

我有一个CONSUMER实体和一个DEVICE实体。消费者和设备之间存在N:M关系。

我有来自CONSUMER的外键CONSUMER_EMAIL和来自DEVICE的DEVICE_INDEX_ID。 CONECTION有时间属性。

生成令牌并将其发送给用户,以便他可以进行身份​​验证以便请求数据。

拥有这两个外键并且还有(device_index_id,time)允许将每个设备区分为唯一键是否有意义? 表格草图:

-------------------------------------------------------------
-- User [conects from] device relationship N:M     ----------
CREATE TABLE conection (                
    token                               CHAR(64)            NOT NULL,   -- Randomly generated and sent to the user                                  
    consumer_email                      VARCHAR(254)        NOT NULL,               
    device_index_id                     UNSIGNED MEDIUMINT  NOT NULL,               
    time                                TIMESTAMP           NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    FOREIGN KEY (consumer_email)                                                
    FOREIGN KEY (device_index_id)                                                       
    UNIQUE KEY (device_index_id, time)
    PRIMARY KEY (token)                                         
) ENGINE=InnoDB;

1 个答案:

答案 0 :(得分:1)

N:M关系表只是

CREATE TABLE ConsumerDevice (
    consumer_email ... -- PRIMARY KEY for Consumer
    device_index_id ... -- PRIMARY KEY for Device
    PRIMARY KEY(consumer_email, device_index_id)  -- for going one way
    INDEX(      device_index_id, consumer_email)  -- for going the other direction
) ENGINE=InnoDB;

是的,您可以添加

time TIMESTAMP NOT NULL

甚至将它默认为更新到当前时间。 您的token是不必要的。 对于给定的Consumer-Device对,您不应该有多行。 2 FOREIGN KEYs应该是显而易见的,但为什么要这么麻烦?

使用INSERT ... ON DUPLICATE KEY UPDATE ...创建新行或一步更新time