thắc mắc Sử dụng Enum trong database.

Ruaconlonton123

Senior Member
Mọi người cho em hỏi về việc lưu enum trong database với ạ.
Em thiết kế db trong đó có cột em sử dụng enum.
Mọi người trong team bảo lưu enum như thế thì khi update dữ liệu của enum sẽ phải viết migrations mới, nên bảo em viết code để validate dữ liệu xong lưu string vào database.
Các bác cho em xin ý kiến với ạ.
Update: Database của em là PostgreSQL ạ
 
Last edited:
Sao không dùng số i32 cho đơn giản vậy thím? Còn nếu muốn dùng String thì tạo bảng mới bỏ String vào kèm 1 cái PK, rồi lấy PK đó làm FK bên bảng data của thím nhé
 
Bạn muốn xin ý kiến gì ở đây nhỉ.
Câu hỏi thì chưa rõ ràng, bạn dùng ngôn ngữ gì, có dùng orm không, nếu có thì nó là, db dạng nào ..v..v
Và chốt lại là bạn muốn hỏi gì? Một câu hỏi dạng yes/ no, đúng/ sai, hay cái gì nhỉ?

via theNEXTvoz for iPhone
 
Bạn muốn xin ý kiến gì ở đây nhỉ.
Câu hỏi thì chưa rõ ràng, bạn dùng ngôn ngữ gì, có dùng orm không, nếu có thì nó là, db dạng nào ..v..v
Và chốt lại là bạn muốn hỏi gì? Một câu hỏi dạng yes/ no, đúng/ sai, hay cái gì nhỉ?

via theNEXTvoz for iPhone
em dùng Rails ạ, e nghĩ đây là câu hỏi về database nên k đề cập đến ngôn ngữ, db là PostgreSQL.
Em muốn hỏi là dùng enum trong vấn đề gì không, hay là lưu string ở database còn code sẽ validate ạ.
 
rails có hỗ trợ enum bằng code, cho phép data type dạng int hoặc string, nên dùng cách này.

dùng enum của db có hạn chế khi muốn add value vào enum khó khăn, phải migrate như teammate của thím nói.

Tôi ủng hộ teammate của thím nhé.
ý teammate của em là lưu string ý ạ, chứ k dùng đến kiểu enum bằng int của rails. Team em k dùng đến enum int của rails tại vì khi query bằng câu query trên terminal hoặc mấy cái tools bất tiện.
 
Tôi thích dùng những kiểu dữ liệu phổ thông hơn. Nếu bên trên app là enum thì xuống dưới lưu string cũng được nhưng tốt hơn là dùng kiểu int đơn thuần. Dùng các kiểu dữ liệu phổ thông thì ko bị phụ thuộc DBMS, nếu sau này đổi sang database khác ko support enum cũng đỡ lăn tăn. :sweet_kiss:
 
Cách nào cũng được thím, mình thì vẫn thích sài enum trong database luôn vì như thế thấy an toàn do nếu để varchar thì có thể code thím check sai thì lưu bị sai rồi. Chuyện migrate khi update enum thì enum trước giờ mình không có update bao giờ, chỉ có trường hợp thêm mới. Trong trường hợp thêm mới thì phải thêm 1 câu SQL alter table (chắc cũng nhẹ, mình đoán), việc này thi mình chấp nhận đánh đổi để dữ liệu trong database nó đảm bảo đúng.
 
team mate của ông đưa ra phương án hợp lý rồi. đó là phương án dựa trên kinh nghiệm.
thao tác với enum type của sql có thể làm phát sinh nhiều thứ phức tạp trong tương lai, tốn thời gian ko cần thiết, càng nhiều việc phát sinh càng có khả năng xuất hiện lỗi

đừng nghĩ khi ông dùng enum type mà ko phải tạo mapping trong code. Cho nên dùng luôn string là hợp lý. Một khi logic code đã sai thì dùng type nào cũng sai chứ chả liên quan gì đến enum hay string hay number cả.
công việc là share cho nhiều người ko phải chỉ cho 1 người, và khi có vấn đề phát sinh trên production thì liên quan tới trách nhiệm nhiều người. tâm lý chung là đếch ai muốn hốt shit của thằng khác hết.
Còn tôi chấp nhận đánh đổi để dữ liệu nó dễ hiểu, dễ maintain giữa mọi người với nhau chứ đếch phải ép để nó tối ưu. Thiếu quái gì cách tối ưu vấn đề cỏn con này chứ.
 
team mate của ông đưa ra phương án hợp lý rồi. đó là phương án dựa trên kinh nghiệm.
thao tác với enum type của sql có thể làm phát sinh nhiều thứ phức tạp trong tương lai, tốn thời gian ko cần thiết, càng nhiều việc phát sinh càng có khả năng xuất hiện lỗi

đừng nghĩ khi ông dùng enum type mà ko phải tạo mapping trong code. Cho nên dùng luôn string là hợp lý. Một khi logic code đã sai thì dùng type nào cũng sai chứ chả liên quan gì đến enum hay string hay number cả.
công việc là share cho nhiều người ko phải chỉ cho 1 người, và khi có vấn đề phát sinh trên production thì liên quan tới trách nhiệm nhiều người. tâm lý chung là đếch ai muốn hốt shit của thằng khác hết.
Còn tôi chấp nhận đánh đổi để dữ liệu nó dễ hiểu, dễ maintain giữa mọi người với nhau chứ đếch phải ép để nó tối ưu. Thiếu quái gì cách tối ưu vấn đề cỏn con này chứ.
Tạo mapping trong code là sao ạ, em dùng kiểu enum của db thì ở code nó vấn là string mà bác. Vấn đề phát sinh khi dùng enum em thấy là khi thêm hay xóa giá trị ra khỏi kiểu enum đấy thôi, như v sẽ phải viết migration để update database, mà thường kiểu enum e nghĩ ít khi phải sửa.
 
ý teammate của em là lưu string ý ạ, chứ k dùng đến kiểu enum bằng int của rails. Team em k dùng đến enum int của rails tại vì khi query bằng câu query trên terminal hoặc mấy cái tools bất tiện.
Enum của rails có support string mà, đâu phải chỉ int.

enum trong db ko có gì sai, nhưng cũng ko có benefit gì đáng kể, nên thường dùng string cho khoẻ.
 
Dùng enum thì update khó, nên tạo một bảng mới lưu giá trị của nó thì dễ chỉnh sửa sau này.

Nếu bạn dự tính sau này gần như không bao giờ thay đổi nó thì hãng dùng enum (dạng int/long trong db). Và nhớ đặt cứng giá trị cho từng flag, đừng để đặt tự động (C#). Sau này sửa code thì các giá trị flag sẽ bị thay đổi nếu bạn không thêm vào cuối.
 
Last edited:
Back
Top