我有一个三级数据结构
level_1 ID,NAME
level_2 ID,NAME,ID_LEVEL1
level_3 ID,NAME,ID_LEVEL2
想法是创建一个单一的微服务来管理三个表上的CRUD。
但是最好的解决方案是什么?
您要运行一次处理数据输入的API还是管理具有三个不同API组的表?
我认为一次性输入数据会导致以下问题:
答案 0 :(得分:2)
在您的情况下,我建议您应用composit design pattern(通常用于管理层次结构)。
并将单个微服务暴露给CRUD您的级别。
在单个表 LEVEL 中,您将有3列:
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类将具有:
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项目结构的更多可见性,但实际上会使您的代码和事务管理变得复杂。