插入分层相关数据

时间:2015-07-10 06:01:25

标签: mysql

假设我们有系统,子系统和设备。他们每个都在0 .. *关系。 以下是表格(为简化起见,不显示属性)

CREATE TABLE system(
sid INT NOT NULL AUTO_INCREMENT,
sysident VARCHAR(80) NOT NULL,
//...
cid INT NOT NULL, //Foreign Key to Customer
PRIMARY KEY(sid));

CREATE TABLE subsystem(
subsid INT NOT NULL AUTO_INCREMENT,//...
subsident INT NOT NULL,
sid INT NOT NULL,    //systems foreign key
PRIMARY KEY(subsid));

CREATE TABLE device(
did INT NOT NULL AUTO_INCREMENT,//...
dident INT NOT NULL, 
subsid INT NOT NULL, //subsystems foreign key
PRIMARY KEY(did));

现在假设有一个sb可以上传数据的界面。数据结构化(JSON)就像这样

{
"systemname": "testsystem", //system.systemname
"deviceinfos": [
    {
        "id": "2-90" //"subsystem.subsystemident-device.deviceident"
    }]
}

任务是插入或更新表中的数据。 (可能是为设备测试系统2-90更改了一些元数据(此标识在表中不是唯一的)。

方法是:

INSERT INTO system(sid, sysident, cid) VALUES 
(
 (SELECT sid FROM (SELECT DISTINCT sid FROM user 
 JOIN customer on user.cid = customer.cid JOIN system 
 ON system.cid = customer.cid 
 WHERE customer.cid = 1 and system.sbid = 1 as a), 'systemsname', 1)
) ON DUPLICATE KEY UPDATE // some metainfo

有没有办法让这更简单?对于系统,正确插入/更新它没有问题。但对于子系统和设备来说,它变得越来越大,我对这种方法持谨慎态度。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的联接,但我认为你不应该深入嵌入查询。

从客户端获取请求,解析它并从那里移动到最不通用的元素。

因此,对于上面的示例,您需要执行多个查询:

  1. SELECT sid from system WHERE name='testsystem'
  2. SELECT subsid FROM subsystem WHERE id=2
  3. ........
  4. 顺便说一句,我不确定我是否理解了你的json中的间隔时间('" 2-90"')。

    这种方法更容易理解。如果您遇到性能问题,则需要单独处理。我认为缓存会加快数量级,然后使用复杂的查询。

    如果要解析的文件包含多个条目,则可以使用本地缓存之类的东西 - 例如从系统名称到sids的映射等。