繁体   English   中英

微服务最佳实践——三层数据结构

[英]microservices best practice - 3 level data structure

我有一个三级数据结构

level_1 ID,NAME

level_2 ID,NAME,ID_LEVEL1

level_3 ID,NAME,ID_LEVEL2

这个想法是创建一个单一的微服务来管理三个表上的 CRUD。

但最好的解决办法是什么?

您是要运行一个 API 来处理一个 go 中的数据输入,还是要管理具有三个不同 API 组的表?

我认为在一个 go 中输入数据会导致以下问题:

  • 管理 CRUD 事务
  • 前端复杂性

在你的情况下,我建议你应用composit design pattern ,通常用于管理层次结构。

并将单个微服务公开给您的关卡。

在单个表LEVEL中,您将有 3 列:

  • id (主键)
  • 姓名
  • parentId (可为空的外键指的是级别id,在删除级联时,这意味着你会)
CREATE TABLE `level` (
  `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(500) NULL,
  `parentId` int unsigned NULL
);

ALTER TABLE `level`
ADD FOREIGN KEY (`parentId`) REFERENCES `level` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION

java class 将具有:

  • 根级别的 parentId 为 null。
  • 叶级没有子级。
  • 使用递归方法找到级别编号,从 position 1 开始。
import javax.persistence.*;
import javax.validation.constraints.Size;
import java.util.Set;


@Entity
@Table(name = "level")
public class Level
{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false, nullable = false)
    private int id;

    @Column
    @Size(max = 500)
    private String name;

    @ManyToOne()
    @JoinColumn(name = "parentId")
    private Level parent;

    @OneToMany(mappedBy="parent",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private Set<Level> children;


    public boolean isLeaf() {
        return (children == null || children.size() == 0);
    }
   
    public boolean isRoot() {
        return (parent == null);
    }
  
    public int getLevelNumber() {
        return getLevelNumber(1);
    }

    private int getLevelNumber(int currentLevel) {
        return parent == null ? currentLevel : parent.getLevelNumber(currentLevel+1) ;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Level getParent()
    {
        return parent;
    }

    public void setParent(Level parent)
    {
        this.parent = parent;
    }

    public Set<Level> getChildren()
    {
        return children;
    }

    public void setChildren(Set<Level> children)
    {
        this.children = children;
    }
}

在我看来,这是最好的优化解决方案。

然后我将有一个存储库


public interface LevelRepository extends JpaRepository<Level, Integer>
{

}

如果您确实需要通过鉴别器值来区分数据库中的级别,那么您可以添加一个鉴别器值并管理多个 java 对象。 它将使您在 java 项目结构中有更多的可见性,但确实会使您的代码和事务管理复杂化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM