2010-10-15 39 views
10

Trong Java quy ước đặt tên cho các thuộc tính en lớp (thực thể) được thực hiện các CamelCase cách:Thực tiễn tốt nhất: quy ước đặt tên cơ sở dữ liệu tốt nhất cho JPA?

@Entity 
public class UserMessage implements Serializable { 
    @Id 
    private Integer id; 
    private String shortTitle; 
    private String longTitle; 
    private String htmlMessage; 
} 

Nhưng trong thế giới SQL nó được coi là một best practice sử dụng chữ in hoa với dấu gạch giữa các từ (như hằng Java). Trong thế giới SQL cũng được coi là thực hành tốt nhất để bao gồm tên bảng trong các tên cột, theo cách này, các khóa ngoại nằm trong hầu hết các trường hợp được đặt tên giống hệt như id trong bảng gốc.

CREATE TABLE USER_MESSAGE (
    USER_MESSAGE_ID MEDIUMINT(8) NOT NULL, 
    USER_MESSAGE_SHORT_TITLE VARCHAR(20), 
    USER_MESSAGE_LONG_TITLE VARCHAR(80), 
    USER_MESSAGE_HTML_MESSAGE TEXT NOT NULL 
); 

Tôi có nên theo cả hai tiêu chuẩn và sử dụng thuộc tính tên trên @Table và @Column không? Hoặc tôi nên làm theo các quy ước Java và dựa vào ánh xạ JPA mặc định.

Cách tiếp cận phổ biến nhất và/hoặc cách tiếp cận tốt nhất về xung đột tiêu chuẩn này là gì?

+0

"Tôi có nên tuân thủ cả hai tiêu chuẩn và sử dụng thuộc tính tên trên @Table và @Column". Đây là câu trả lời của bạn. Hãy để chú thích thực hiện công việc của họ. – Sean

+1

Tôi không chắc chắn rằng tôi thực sự đồng ý rằng quy ước đặt tên rất tức giận được coi là "thực hành tốt nhất" trong "thế giới SQL". Chỉ cần nói ... – BobbyShaftoe

Trả lời

5

Tôi có nên theo cả hai tiêu chuẩn và sử dụng thuộc tính tên trên @Table và @Column không? Hoặc tôi nên làm theo các quy ước Java và dựa vào ánh xạ JPA mặc định.

Nếu ước mặc định JPA không phù hợp với ưa thích ước của công ty bạn (không có "một sự thật" chuẩn), ghi đè lên chúng. Điều này có thể được thực hiện bằng cách sử dụng chú thích @Table@Column (trong trường hợp cụ thể của Hibernate, bạn cũng có thể cung cấp implementation of a NamingStrategy của riêng mình).

Cách tiếp cận phổ biến nhất và/hoặc cách tiếp cận tốt nhất về xung đột tiêu chuẩn này là gì?

Không có mâu thuẫn, có Java ước đặt tên, có một ước mặc định ở phía JPA cho các bản đồ của các đối tượng để bàn (vì JPA phải chọn một) và không có "một đúng "tiêu chuẩn về phía SQL. Vì vậy:

  • nếu công ty của bạn không có bất kỳ quy ước đặt tên SQL, bạn có thể sử dụng các công ước JPA
    • nếu bạn không thích chúng, ghi đè lên chúng
  • nếu công ty của bạn có quy ước tại chỗ, theo dõi và ghi đè các giá trị mặc định JPA
+0

Cảm ơn Pascal. Khác: Làm thế nào bạn sẽ xử lý xung đột đặt tên gây ra bởi không tồn tại của một không gian tên gói trong cơ sở dữ liệu? Ví dụ: bạn có một thực thể app.model.forum.Post và app.model.blog.Post. Bạn sẽ đổi tên các lớp đó thành các tên duy nhất như ForumPost và BlogPost để chúng có thể tham chiếu đến các tên bảng giống nhau không? Làm thế nào để giải quyết tốt nhất xung đột không gian tên này? – Kdeveloper

+0

@Kdeveloper Nếu bạn quyết định dựa vào các giá trị mặc định JPA, thì bạn phải sử dụng các tên thực thể riêng biệt, như trong ví dụ của bạn (và điều này cũng sẽ làm cho việc truy vấn dễ dàng hơn). –

2

Làm theo cả hai. Quy ước db nên có cho các báo cáo và các truy vấn của DBA vì lợi ích và các truy vấn mà bộ trí óc khác nhau. Sử dụng tên params trên chú thích để đạt được điều này.

2

Tôi cho rằng điều này phụ thuộc vào các quy ước mà bạn đang đề cập đến. Tôi không đặt tên bảng vào tên cột - điểm của việc mất một nửa không gian tên của bạn chỉ để lặp lại những gì bạn đã biết là gì? (Một số) quy tắc mà tôi (cố gắng) tuân theo là:

  1. Tên dài, có ý nghĩa tốt hơn tên viết tắt, ví dụ: TRANSACTION_DATE thay vì TRAN_DT. Có, tôi đủ tuổi để viết Fortran khi bạn bị giới hạn trong các tên biến 6 ký tự và tôi nhớ lại các biến thể cơ bản mà bạn chỉ có AZ, A0-Z0 ... A9-Z9 - nhưng tôi cũng đủ tuổi để học tốt hơn. Tên biến đơn ký tự cho các chỉ mục, v.v. là tốt - và thực tế là truyền thống - nhưng khi tôi tìm thấy một hàm có mười hai tên biến riêng lẻ được sử dụng cho nhiều mục đích tôi ... không thích thú.

  2. Khóa chính nhân tạo được đặt tên là ID_ < < "tên bảng" >>.

  3. Các khóa chính dữ liệu tự nhiên một trường là tốt nhất. Các khóa chính tự nhiên hai trường là OK. Ba hoặc nhiều trường - tạo một khóa chính nhân tạo và tạo khóa tự nhiên là khóa duy nhất thay thế.

  4. Bạn sẽ không bao giờ, không bao giờ, tính vào ngày, giờ hoặc trường ngày/giờ là duy nhất. Không bao giờ. Đừng quên điều này. Ý tôi là nó.

  5. Kỹ thuật mã hóa gây hiểu lầm tương đương với tính không đủ năng lực.

Tôi chắc chắn có nhiều hơn nhưng đó là sự khởi đầu. Tất cả IMHO. YMMV.

Chia sẻ và thưởng thức.

2

Theo như tôi quan tâm, hoặc là chấp nhận được. Nhưng nếu bạn quyết định không muốn trường hợp lạc đà mặc định, bạn CÓ THỂ nhận được một chiến lược đặt tên khác mà không phải dùng đến công việc tẻ nhạt và dễ bị lỗi khi thêm thuộc tính name vào mọi chú thích.

Hãy xem lớp org.hibernate.cfg.ImprovedNamingStrategy của Hibernate. Nó sử dụng dấu gạch dưới thay vì trường hợp lạc đà. Nó chỉ đơn giản là vấn đề thiết lập một thuộc tính trên cấu hình Hibernate của bạn để sử dụng nó.

Bạn cũng có thể mở rộng ImprovedNamingStrategy để thêm tên bảng hoặc làm tất cả chữ hoa nếu bạn thực sự muốn, nhưng điều đó có vẻ không cần thiết.

Các vấn đề liên quan