Yêu cầu thg 2 20, 2020 10:37 SA 1098 0 4
  • 1098 0 4
0

Có nên khởi tạo các foreign Key giữa các model trong Spring Boot?

Chia sẻ
  • 1098 0 4

Mình đang dùng Spring Boot để tạo ra 1 api Log_SMS mình đang không hiểu ở chổ là nên tạo các foreign key giữa các bảng trong code hay là dùng workbench để tạo. Khi mình dùng thử foreign key trong code thì khi gửi request post lên server thì mình thấy nó hơi phức tạp. Lỗi sai dữ liệu liên tục Sms.java

package com.logsms.logsms.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity
@Table(name = "sms")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createAt"}, allowGetters = true)
public class Sms implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Enumerated(EnumType.STRING)
	private TypeSend typeSend;
	
	@ManyToOne
	@JoinTable(name = "sender_sms",
	joinColumns = @JoinColumn(name = "sms_id"),
	inverseJoinColumns = @JoinColumn(name = "sender_id"))
	private Sender sender;
	
	@ManyToOne
	@JoinTable(name = "provider_sms", 
	joinColumns = @JoinColumn(name = "sms_id"),
	inverseJoinColumns = @JoinColumn(name = "provider_id"))
	private Provider provider;
	
	@NotBlank
	private String numberPhone;
	
	
	@NotBlank
	private String context;
	
	private Boolean status = false;

	@Column(nullable = false, updatable = false)
	@Temporal(TemporalType.TIMESTAMP)
	@CreatedDate
	private Date createdDate;
	
	private Date sendedDate;
	
	
	public Sms() {}
	
	public Sms(String context, String numberPhone) {
		this.context = context;
		this.numberPhone = numberPhone;
	}
	
	public Long getId() {
		return id;
	}

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

	public Sender getSender() {
		return sender;
	}
	public void setSender(Sender sender) {
		this.sender = sender;
	}
	public Provider getProvider() {
		return provider;
	}
	public void setProvider(Provider provider) {
		this.provider = provider;
	}
	public String getContext() {
		return context;
	}

	public void setContext(String context) {
		this.context = context;
	}

	public Boolean getStatus() {
		return status;
	}

	public void setStatus(Boolean status) {
		this.status = status;
	}

	public Date getCreateDate() {
		return createdDate;
	}


	public Date getSendedDate() {
		return sendedDate;
	}

	
	public String getNumberPhone() {
		return numberPhone;
	}

	public void setNumberPhone(String numberPhone) {
		this.numberPhone = numberPhone;
	}
}

Provider.java

package com.logsms.logsms.model;



import javax.persistence.*;

@Entity
@Table(name = "provider")
public class Provider {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	private String name;

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

	public Long getId() {
		return id;
	}

	public Provider(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}

Sender.java

package com.logsms.logsms.model;

import javax.persistence.*;


@Entity
@Table(name = "sender")
public class Sender {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	private String name;
	
	public Sender(String name) {
		this.name = name;
	}

	public Sender() {}

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

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

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}
	
	
	
}

4 CÂU TRẢ LỜI


Đã trả lời thg 2 29, 2020 8:28 SA
Đã được chấp nhận
+1

Như các bạn trên đã nói, thay vì ràng buộc quan hệ trong DB thì bạn hãy sử dụng các ràng buộc quan hệ bằng Model của Spring để tránh việc lỗi liên kết khi ứng dụng chạy. Hoặc nếu bạn vẫn muốn đặt ràng buộc trong DB thì hãy thử 1 cách gọi là: Soft Delete

Tức là không hoàn toàn xóa bản ghi đó trong DB mà bạn đặt thêm 1 trường trạng thái cho bản ghi đó, ví dụ trường đó có tên là: isDeleted, khi trường này bằng true thì tức là bản ghi đã được xóa và khi query thì bạn hãy tránh các trường có isDeleted = true ra, khá là đơn giản

Chia sẻ
Đã trả lời thg 2 20, 2020 10:47 SA
+1

Theo mình thì bạn chỉ nên định nghĩa mối quan hệ giữa các models để query dễ hơn

chứ không nên định nghĩa foreign key khi migrate các table, bởi các rằng buộc quá chặt chẽ sẽ làm bạn query rất mệt

và làm hệ thống dễ gặp lỗi nếu query của bạn k đáp ứng các ràng buộc, tất nhiên điều này sẽ giúp hệ thống chất lượng hơn

nhưng bạn nên cân nhắc tùy vào mức độ quan trọng của dữ liệu và hệ thống.

Chia sẻ
Avatar Pin Vu @pinpolygons
thg 2 21, 2020 2:09 SA
Đã trả lời thg 2 21, 2020 1:57 SA
+1

Mình thì không làm về Spring. Nhưng theo mình và cũng khá nhiều người thì họ sẽ không tạo các key liên kết giữa các bảng như vậy. Vì lúc đó việc bạn thao tác với dữ liệu sẽ gặp rất nhiều khó khăn nếu bảng của bạn được liên kết với nhiều bảng khác. Thường thì mình sẽ chỉ định nghĩa mối quan hệ trong Model mà thôi 😄

Chia sẻ
Đã trả lời thg 2 21, 2020 7:27 SA
+1

https://www.sqlservercentral.com/articles/trust-or-verify-–-how-fks-can-or-cannot-help-performance nên dùng, và ít nhất, để tránh shit code hoặc những thằng khác tạo ra shit code, nếu trường nào hoặc tập hợp trường là unique thì phải migrate nó vào database.

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí