数据库的设计是否有效?

时间:2012-01-13 05:09:33

标签: mysql database-design

我有以下表格:

CREATE TABLE `app_ws_common` (                                                                                                     
          `serviceid` varchar(16) NOT NULL,                                                                                             
          `applicationid` varchar(16) default NULL,                                                                                     
          `modifieddate` date default NULL,                                                                                             
          `version` decimal(1,0) default NULL,                                                                                          
          `servicename` varchar(20) default NULL,                                                                                       
          `userid` varchar(128) NOT NULL,                                                                                             
          PRIMARY KEY  (`serviceid`,`userid`),                                                                                        
          KEY `table1_isv_fk` (`applicationid`,`userid`),                                                                             
          CONSTRAINT `table1_isv_fk` FOREIGN KEY (`applicationid`, `userid`) REFERENCES `applications` (`applicationid`, `userid`)  
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1



 CREATE TABLE `app_ws_user` (                                                                                                     
           `serviceid` varchar(16) NOT NULL,                                                                                              
           `userid` varchar(128) NOT NULL,                                                                                              
           `applicationid` varchar(16) default NULL,                                                                                      
           `modifieddate` date default NULL,                                                                                              
           `version` decimal(1,0) default NULL,                                                                                           
           `servicename` varchar(20) default NULL,                                                                                        
           PRIMARY KEY  (`serviceid`,`userid`),                                                                                         
           KEY `FK_app_ws_user` (`applicationid`,`userid`),                                                                             

           CONSTRAINT `FK_app_ws_user` FOREIGN KEY (`applicationid`, `userid`) REFERENCES `applications` (`applicationid`, `userid`)  
         ) ENGINE=InnoDB DEFAULT CHARSET=latin1


CREATE TABLE `applications` (                  
            `applicationid` varchar(16) NOT NULL,        
            `userid` varchar(128) NOT NULL,            
            `applicationname` varchar(30) default NULL,  
            PRIMARY KEY  (`applicationid`,`userid`)    
          ) ENGINE=InnoDB DEFAULT CHARSET=latin1  

 CREATE TABLE `external_ws_common` (           
               `serviceid` varchar(16) NOT NULL,        
               `modifieddate` date default NULL,        
               `version` decimal(1,0) default NULL,     
               `servicename` varchar(20) default NULL,  
               PRIMARY KEY  (`serviceid`)               
             ) ENGINE=InnoDB DEFAULT CHARSET=latin1  


CREATE TABLE `external_ws_user` (            
                `serviceid` varchar(16) NOT NULL,          
                `userid` varchar(128) NOT NULL,          
                `applicationid` varchar(16) default NULL,  
                `modifieddate` date default NULL,          
                `version` decimal(1,0) default NULL,       
                `servicename` varchar(20) default NULL,    
                PRIMARY KEY  (`serviceid`,`userid`)      
              ) ENGINE=InnoDB DEFAULT CHARSET=latin1

下面:

app_ws_common 表包含所有用户共有的所有应用相关服务

app_ws_user 表包含特定用户创建的所有与应用程序相关的服务,并从其通用版本进行编辑。

应用程序表将包含应用程序列表和相应的用户。

external_ws_common 表将包含独立于所有应用程序且对所有用户通用的服务列表。

external_ws_user 表将包含与任何应用程序不对应并由用户从“常见”版本的外部服务创建或编辑的服务列表。

现在,我必须从表app_ws_user中检索所有与应用程序相关的服务,并在app_ws_user表中没有该特定用户的编辑版本时从表app_ws_common中检索所有服务。

如何有效地为此编写查询? 或者我应该重新设计这张桌子?

1 个答案:

答案 0 :(得分:0)

希望这会有所帮助:::

SELECT 
      service_id, service_name
      FROM app_ws_common awc
    left join app_ws_user awu on (awc.serviceid=awu.serviceid and awc.applicationid=awu.applicationid)
UNION
    SELECT service_id, service_name
      FROM app_ws_common awc
    right join app_ws_user awu on (awc.serviceid=awu.serviceid and awc.applicationid=awu.applicationid)