架构思路模式实战

现在有一个编码表的问题困扰着******,我告诉你们的答案是,目前的方案经过修正,将是维护代价最低,开发最快捷的方式。
基本上,所有架构都是遵循模式1的实现,好处是
1、强类型,维护代价低,便于调试
2、逻辑清晰,符合业务场景
3、便于按领域概念,分类处理代码

但对于开发员来说,类似BaseClass的子类如果过多,每个子类一张表将非常难于维护,此时模式2的实现模式更好,但弱类型会导致后期维护困难。
所以我们可以利用数据库的一些特点引入模式2的好处

1、凡是子类属性形如(Id,Name)的存入编码表(codetable),其中TypeId为类型Id
CREATE TABLE `codetable` (
`Id` int(11) NOT NULL,
`TypeId` int(11) NOT NULL,
`Name` varchar(45) DEFAULT NULL,
UNIQUE KEY `Primary_idx` (`Id`,`TypeId`),
KEY `Type_idx` (`TypeId`),
CONSTRAINT `Type` FOREIGN KEY (`TypeId`) REFERENCES `codetypetable` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE
)
2、每一存入编码表(codetable)的子类,对应编码类型表(codetypetable)中一项,ViewName对应采用模式1生成的类的表名
CREATE TABLE `codetypetable` (
`Id` int(11) NOT NULL,
`Name` varchar(45) NOT NULL,
`ViewName` varchar(45) NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `ViewName_UNIQUE` (`ViewName`),
UNIQUE KEY `Name_UNIQUE` (`Name`)
);

3、若子类属性形如(Id,Name,XXXXX),实现模式遵循模式1
CREATE TABLE `classatable` (
`Id` int(11) NOT NULL,
`Name` varchar(45) DEFAULT NULL,
`Value` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`)
);

4、数据库中建立两个存储过程,将对编码类型表(codetypetable)中一项创建相应的view
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `createClassViews`()
BEGIN
DECLARE row_id INT;
DECLARE row_name VARCHAR(45);

DECLARE fetched INT DEFAULT 1;

DECLARE codeTypeCursor CURSOR FOR SELECT Id, ViewName FROM CodeTypeTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetched := 0;

OPEN codeTypeCursor;
REPEAT
FETCH codeTypeCursor INTO row_id,row_name;
IF fetched = 1 THEN
CALL createClassView(row_name);
END IF;

UNTIL fetched = 0 END REPEAT;
CLOSE codeTypeCursor;
END$$
DELIMITER ;

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `createClassView`(IN viewName VARCHAR(45))
BEGIN
SET @sql = CONCAT('DROP VIEW IF EXISTS ', viewName);
prepare stm from @sql;
execute stm;
deallocate prepare stm;

SET @sql = CONCAT('CREATE VIEW ', viewName, ' AS
SELECT c.Id AS Id, c.Name AS Name
FROM codetable c
WHERE c.TypeId = (SELECT t.Id AS Id
FROM codetypetable t
WHERE t.ViewName = ''', viewName, ''')');
prepare stm from @sql;
execute stm;
deallocate prepare stm;
END$$
DELIMITER ;

5、所有编码子类的实现仍完全遵循模式1,即目前的生成代码不变!

 

这些view操作起来和目前的表是相同的

问题:如果子类中要添加一些基类中不存在的属性怎么办?
方案:在元模型中添加该类的这些属性,重新生成代码。如果已进入运维期,使用对应的view导出代码表中数据到生成的数据库表中,并删除生产或测试数据库中编码类型中该类对应的行,及对应的view。

注意:以上方案中,codetable,及codetypetable在开发人员数据库中不需要存在,只要在测试数据库或生产数据库中存在即可。

原文地址:https://www.cnblogs.com/zzt-lovelinlin/p/9638799.html