TL; DR: Chuỗi có lẽ là sự lựa chọn an toàn hơn và sự khác biệt về hiệu suất nên không đáng kể. Các số nguyên có ý nghĩa đối với các bộ sưu tập lớn trong đó enum phải được lập chỉ mục. Ymmv.
Tôi đã nghĩ đến việc lưu trữ nó bằng các số nguyên mà tôi cho rằng sử dụng ít không gian hơn là lưu trữ các chuỗi cho mọi thứ có thể dễ dàng được thể hiện dưới dạng một số nguyên
True.
Mặt khác tôi thấy khi sử dụng số nguyên là nếu tôi muốn đổi tên thành tích hoặc thứ hạng, tôi có thể dễ dàng thay đổi nó mà không phải chạm vào cơ sở dữ liệu.
Đây là một lợi ích chính của số nguyên theo ý kiến của tôi. Tuy nhiên, nó cũng đòi hỏi bạn phải đảm bảo các giá trị liên quan của
import org.bson.codecs.pojo.ClassModel;
import org.bson.codecs.pojo.PojoCodecProvider;
import org.bson.codecs.pojo.PojoCodecProvider.Builder;
import com.ps2pdf.models.enums.ProcessType; // Local
...
Builder builder =
ClassModel classModel = ClassModel.builder[ProcessType.class].build[];
builder.register[classModel];
1 không thay đổi. Nếu bạn vặn nó lên, bạn gần như chắc chắn sẽ tàn phá, đó là một bất lợi lớn.almost certainly wreak havoc, which is a huge disadvantage.Một lợi ích tôi thấy khi sử dụng chuỗi là dữ liệu đòi hỏi ít xử lý hơn trước khi nó được sử dụng
Nếu bạn thực sự sử dụng một loại dữ liệu enum, có lẽ đó là một số nguyên trong nội bộ, vì vậy số nguyên nên yêu cầu ít xử lý hơn. Dù bằng cách nào, chi phí đó nên không đáng kể.
Có một lý do mạnh mẽ để sử dụng số nguyên hoặc chuỗi?
Tôi đang lặp lại rất nhiều những gì đã nói, nhưng có lẽ điều đó giúp các độc giả khác. Tổng hợp:
- Trộn giá trị ENUM HAVOCS HAVOC. Hãy tưởng tượng các quốc gia
2 của bạn đột nhiên được hiểu làimport org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
3, bởi vìimport org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
2 có giá trị '2' và bây giờ làimport org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
3 vì bạn đã sắp xếp lại enum và quên gán các giá trị theo cách thủ công ... [rùng mình]import org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
- Chuỗi biểu cảm hơn
- Số nguyên mất ít không gian hơn. Không gian đĩa không quan trọng, thông thường, nhưng không gian chỉ số sẽ ăn RAM đắt tiền.
- Cập nhật số nguyên không thay đổi kích thước đối tượng. Chuỗi, nếu độ dài của chúng khác nhau rất nhiều, có thể yêu cầu phân bổ lại. Tuy nhiên, yếu tố đệm và đệm nên làm giảm bớt điều này.
- Các số nguyên có thể là cờ [chưa thể truy vấn [chưa], thật không may, xem Server-3518]
- Các số nguyên có thể được truy vấn bởi
6 /import org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
7 để bạn có thể thực hiện hiệu quả các truy vấnimport org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
8 phức tạp, mặc dù đó là một yêu cầu khá phức tạp và không có gì sai với các truy vấnimport org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
8 ...import org.bson.codecs.pojo.ClassModel; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.codecs.pojo.PojoCodecProvider.Builder; import com.ps2pdf.models.enums.ProcessType; // Local ... Builder builder = ClassModel classModel = ClassModel.builder[ProcessType.class].build[]; builder.register[classModel];
Nếu bạn muốn lưu giá trị enum java vào db dưới dạng tên enum, thì trình điều khiển Mongo sẽ hỗ trợ điều đó. Ví dụ: nếu bạn có một enum
public enum ProcessType {
CONVERT_ONE_TO_ONE,
CONVERT_ONE_TO_MANY;
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
và nó được đăng ký với nhà cung cấp codec Mongo là
import org.bson.codecs.pojo.ClassModel;
import org.bson.codecs.pojo.PojoCodecProvider;
import org.bson.codecs.pojo.PojoCodecProvider.Builder;
import com.ps2pdf.models.enums.ProcessType; // Local
...
Builder builder =
ClassModel classModel = ClassModel.builder[ProcessType.class].build[];
builder.register[classModel];
Nhập chế độ FullScreenen EXIT Mode FullScreen
Sau đó, bất cứ khi nào bạn lưu một thể hiện của một lớp với một loại thuộc tính ProcessType vào DB, tài liệu Mongo kết quả sẽ có giá trị chuỗi
export enum WebsocketProcessType {
CONVERT_ONE_TO_ONE = 'convert-one-to-one',
CONVERT_ONE_TO_MANY = 'convert-one-to-many',
}
0 hoặc export enum WebsocketProcessType {
CONVERT_ONE_TO_ONE = 'convert-one-to-one',
CONVERT_ONE_TO_MANY = 'convert-one-to-many',
}
1 cho thuộc tính đó.Nếu đó là tất cả những gì bạn cần, thì điều sau đây không dành cho bạn. Trong trường hợp đó, bạn có thể làm theo hướng dẫn của Mongo Pojo để hướng dẫn bạn.
Sau đây là một cách để lưu trữ giá trị liên quan đến enum java trong MongoDB. Tại sao ai đó muốn làm điều đó?
- Java [cũng TypeScript] có quy ước sử dụng tên trường hợp trên trong enums, có lẽ được kế thừa từ việc sử dụng tên chữ hoa cho các hằng số.
- Tôi thích gán các giá trị chữ thường cho các thuộc tính đối tượng [như nhiều người làm]
- Ngăn chặn tên tài sản buộc vào giá trị của nó. Tôi thích giữ ngắn tên biến và giá trị được gán cho nó có thể là bất cứ điều gì.
Trên đây là một vài lý do để lưu các giá trị enum thay vì tên vào MongoDB.
Một điểm đau khác đối với tôi là so sánh các giá trị enum được giải mã ở phía trước. Sau đây là enum TypeScript Front-end cho Java enum trên.
export enum WebsocketProcessType {
CONVERT_ONE_TO_ONE = 'convert-one-to-one',
CONVERT_ONE_TO_MANY = 'convert-one-to-many',
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript [JS].
Thực hiện
Steps:
- Tạo và đăng ký một nhà cung cấp codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum java
- Tạo và đăng ký Bộ giải mã Enum cho
2export enum WebsocketProcessType { CONVERT_ONE_TO_ONE = 'convert-one-to-one', CONVERT_ONE_TO_MANY = 'convert-one-to-many', }
- Tạo và đăng ký Enum với DB
Tôi sẽ làm cho một số lớp là chung chung vì điều này có thể được sử dụng để giải mã tất cả các enum.
Tạo nhà cung cấp codec
Tôi sẽ không cung cấp nhập khẩu vì bạn nên có Trình điều khiển Mongo Java và với IDE hiện đại, bạn có thể tự động nhập tất cả nhập khẩu.
public class EnumCodecProvider implements CodecProvider {
@Override
public Codec get[Class clazz, CodecRegistry registry] {
if [clazz == ProcessType.class] {
return [Codec] new ProcessTypeCodec[];
}
return null; // Don't throw here, this tells Mongo this provider doesn't provide a decoder for the requested clazz
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
CodecRegistry pojoCodecRegistry =
fromRegistries[MongoClient.getDefaultCodecRegistry[],
CodecRegistries.fromRegistries[
CodecRegistries.fromProviders[new EnumCodecProvider[]]
],
];
MongoClientOptions options = MongoClientOptions.builder[].codecRegistry[pojoCodecRegistry].build[];
// Register above option with the MongoClient
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript [JS].
Thực hiện
abstract class AbstractCodec implements Codec {
public AbstractCodec[] {
}
@Override
final public void encode[final BsonWriter writer, final T value, final EncoderContext encoderContext] {
String val = [[Enum] value].toString[];
writer.writeString[val];
}
@Override
final public T decode[final BsonReader reader, final DecoderContext decoderContext] {
try {
String value = reader.readString[];
Method method = getEncoderClass[].getDeclaredMethod["fromValue", String.class];
T enumName = [T] method.invoke[null, value];
return enumName;
}catch[Exception e] {
try {
String value = reader.readString[];
Method method = getEncoderClass[].getDeclaredMethod["getDefaultValue"];
T storageType = [T] method.invoke[null, value];
return storageType;
} catch [Exception e1] {
e1.printStackTrace[];
}
e.printStackTrace[];
}
return null;
}
public abstract Class getEncoderClass[];
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript [JS].
Thực hiện
Tạo và đăng ký một nhà cung cấp codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum java
public class ProcessTypeCodec extends AbstractCodec {
public ProcessTypeCodec[] {
super[];
}
@Override
public Class getEncoderClass[] {
return ProcessType.class;
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript [JS].
public enum ProcessType {
CONVERT_ONE_TO_ONE["convert-one-to-one"],
CONVERT_ONE_TO_MANY["convert-one-to-many"];
private String value;
private static final Map ENUM_MAP;
static {
Map map = new HashMap[];
for [ProcessType instance : ProcessType.values[]] {
map.put[instance.value[], instance];
}
ENUM_MAP = Collections.unmodifiableMap[map];
}
ProcessType[String type] {
this.value = type;
}
public String value[] {
return this.value;
}
public static ProcessType fromValue[String value] {
return ENUM_MAP.get[value];
}
/**
* Used by the Mongo codec
*
* @return
*/
public static ProcessType getDefaultValue[] {
return CONVERT_ONE_TO_ONE;
}
/**
* Required to properly convert Java Enum name to value.
* Value is used by front-end and usually uses
* 1. lowercase
* 2. dashes instead of underscores
*/
@Override
public String toString[] {
return this.value;
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript [JS].
Thực hiện
export enum OutputExtension {
MP4 = '.mp4',
WEBM = '.webm'
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.
public enum OutputExtension {
MP4[".mp4"],
WEBM[".webm"]
// ... rest of the code similar to above ProcessType Enum
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript [JS].
i.e.
Thực hiện
Nhập chế độ FullScreenen EXIT Mode FullScreen
Tạo và đăng ký một nhà cung cấp codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum java