2015-07-10 62 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的映射等等。