假设我们有系统,子系统和设备。他们每个都在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
有没有办法让这更简单?对于系统,正确插入/更新它没有问题。但对于子系统和设备来说,它变得越来越大,我对这种方法持谨慎态度。
有什么建议吗?
答案 0 :(得分:1)
我不确定我是否理解你的联接,但我认为你不应该深入嵌入查询。
从客户端获取请求,解析它并从那里移动到最不通用的元素。
因此,对于上面的示例,您需要执行多个查询:
SELECT sid from system WHERE name='testsystem'
SELECT subsid FROM subsystem WHERE id=2
这种方法更容易理解。如果您遇到性能问题,则需要单独处理。我认为缓存会加快数量级,然后使用复杂的查询。
如果要解析的文件包含多个条目,则可以使用本地缓存之类的东西 - 例如从系统名称到sids的映射等。