zoukankan      html  css  js  c++  java
  • 架构思路模式实战

    现在有一个编码表的问题困扰着******,我告诉你们的答案是,目前的方案经过修正,将是维护代价最低,开发最快捷的方式。
    基本上,所有架构都是遵循模式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在开发人员数据库中不需要存在,只要在测试数据库或生产数据库中存在即可。

  • 相关阅读:
    python学习笔记十五-生成器
    python学习笔记十四-迭代器
    python学习笔记十三-装饰器
    The Zen of Python, by Tim Peters
    python学习笔记十二-函数
    python学习笔记十一-集合set
    tensorflow2 gpu 在 win10 上安装过程和问题处理
    anaconda navigator stuck 卡在 loading applications... 处理
    python工具pip加速For windows
    WCF With StructureMap
  • 原文地址:https://www.cnblogs.com/zzt-lovelinlin/p/9638799.html
Copyright © 2011-2022 走看看