微服务最佳实践-3级数据结构

时间:2020-08-18 09:36:42

标签: java microservices

我有一个三级数据结构

level_1 ID,NAME

level_2 ID,NAME,ID_LEVEL1

level_3 ID,NAME,ID_LEVEL2

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

但是最好的解决方案是什么?

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

我认为一次性输入数据会导致以下问题:

  • 管理CRUD交易
  • 前端复杂度

1 个答案:

答案 0 :(得分:2)

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

并将单个微服务暴露给CRUD您的级别。

在单个表 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类将具有:

  • 根级别的parentId为null。
  • 叶子水平没有孩子。
  • 使用递归方法找到级别编号,从位置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项目结构的更多可见性,但实际上会使您的代码和事务管理变得复杂。