2015-07-10 31 views
0

假设我们有系统,子系统和设备。他们每个人都在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" 
    }] 
} 

任务是在表中插入或更新的数据。 (也许一些元数据改变设备testsystem-2-90(此IDENT不是唯一的表中)

做法是:?

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

我不知道我理解你的正常连接,但我不要认为你应该使用嵌套如此深的查询。

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

所以,上面的例子中,你需要执行多个查询:

  1. SELECT sid from system WHERE name='testsystem'
  2. SELECT subsid FROM subsystem WHERE id=2
  3. ........

BTW,我不是当然我正确理解你的json的时间间隔(''2-90'')。

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

如果您正在解析的文件包含多个条目,则可以使用类似本地缓存的内容 - 从系统名称到sids的映射等等。