ডাটাবেসে এনামগুলিকে সংরক্ষণ করার উপায়


123

একটি ডাটাবেসে এনামগুলিকে সংরক্ষণ করার সর্বোত্তম উপায় কী?

আমি জানি জাভা সরবরাহ করে name()এবংvalueOf() এনাম মানগুলিকে স্ট্রিং এবং পিছনে রূপান্তর করার জন্য পদ্ধতি সরবরাহ করে। তবে এই মানগুলি সংরক্ষণ করার জন্য কি অন্য কোনও (নমনীয়) বিকল্প রয়েছে?

এনামগুলিকে অনন্য সংখ্যায় তৈরি করার কোনও স্মার্ট উপায় আছে ( ordinal()ব্যবহার করা নিরাপদ নয়)?

হালনাগাদ:

দুর্দান্ত এবং দ্রুত উত্তরগুলির জন্য ধন্যবাদ! এটা আমার সন্দেহ ছিল।

তবে 'টুলকিট'কে একটি নোট; এটি একটি উপায়। সমস্যাটি হ'ল আমার তৈরি প্রতিটি এনুম টাইপের সাথে আমাকে একই পদ্ধতি যুক্ত করতে হবে। প্রচুর নকল কোড রয়েছে এবং এই মুহুর্তে জাভা এটির জন্য কোনও সমাধান সমর্থন করে না (একটি জাভা এনাম অন্যান্য শ্রেণি প্রসারিত করতে পারে না)।


2
অর্ডিনাল () ব্যবহার করা কেন নিরাপদ নয়?
মাইকেল মায়ার্স

কি ধরনের ডাটাবেস? মাইএসকিউএলের একটি এনাম টাইপ রয়েছে, তবে আমি মনে করি না এটি স্ট্যান্ডার্ড এএনএসআই এসকিউএল।
শেরম পেন্ডলি 14

6
কারণ এরপরে যে কোনও গুনমূলক সংযোজন অবশ্যই শেষ করা উচিত। একটি
অবিশ্বাস্য

1
আমি দেখি. অনুমান করুন এটি একটি ভাল জিনিস যা আমি ডেটাবেসগুলির সাথে বেশি কিছু করি না, কারণ আমি খুব বেশি দেরি না হওয়া পর্যন্ত সম্ভবত এটি সম্পর্কে ভাবতাম না।
মাইকেল ম্যাইইয়ার্স

উত্তর:


165

আমরা আর কখনও সংখ্যার অর্ডিনাল মান হিসাবে গণনা সঞ্চয় করি না ; এটি ডিবাগিং এবং সহায়তা করার উপায়টিকে খুব কঠিন করে তোলে। আমরা প্রকৃত গণনা মান স্ট্রিংয়ে রূপান্তর করি:

public enum Suit { Spade, Heart, Diamond, Club }

Suit theSuit = Suit.Heart;

szQuery = "INSERT INTO Customers (Name, Suit) " +
          "VALUES ('Ian Boyd', %s)".format(theSuit.name());

এবং তারপরে আবার পড়ুন:

Suit theSuit = Suit.valueOf(reader["Suit"]);

সমস্যাটি আগে এন্টারপ্রাইজ ম্যানেজারের দিকে তাকাতে এবং ডিসিফার করার চেষ্টা করেছিল:

Name                Suit
==================  ==========
Shelby Jackson      2
Ian Boyd            1

আয়াত

Name                Suit
==================  ==========
Shelby Jackson      Diamond
Ian Boyd            Heart

দ্বিতীয়টি অনেক সহজ is পূর্বেরটির উত্স কোডটি পাওয়া এবং সংখ্যাগরিষ্ঠ সদস্যদের জন্য নির্ধারিত সংখ্যাসমূহের সন্ধান করা দরকার।

হ্যাঁ এটিতে আরও বেশি জায়গা লাগে, তবে গণনার সদস্যদের নামগুলি সংক্ষিপ্ত, এবং হার্ড ড্রাইভগুলি সস্তা, এবং যখন আপনার কোনও সমস্যা হচ্ছে তখন সাহায্য করার জন্য এটি আরও বেশি মূল্যবান।

অতিরিক্ত হিসাবে, আপনি যদি সংখ্যার মানগুলি ব্যবহার করেন তবে আপনি সেগুলির সাথে আবদ্ধ হন। আপনি পুরাতন সংখ্যাসূচক মানগুলি চাপ না দিয়ে সদস্যদের সুন্দরভাবে সন্নিবেশ বা পুনঃব্যবস্থা করতে পারবেন না। উদাহরণস্বরূপ, স্যুট গণনা এতে পরিবর্তন করা হচ্ছে:

public enum Suit { Unknown, Heart, Club, Diamond, Spade }

হতে হবে:

public enum Suit { 
      Unknown = 4,
      Heart = 1,
      Club = 3,
      Diamond = 2,
      Spade = 0 }

ডাটাবেসে সঞ্চিত উত্তরাধিকারের সংখ্যা সংক্রান্ত মানগুলি বজায় রাখতে।

কীভাবে তাদের ডাটাবেসে বাছাই করা যায়

প্রশ্নটি আসে: আসুন বলতে দিন যে আমি মানগুলি অর্ডার করতে চেয়েছিলাম। কিছু লোক এনামের মূল মান অনুসারে এগুলি বাছাই করতে চাইতে পারে। অবশ্যই, গণনার সংখ্যাগত মান দ্বারা কার্ডগুলি অর্ডার করা অর্থহীন:

SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)

Suit
------
Spade
Heart
Diamond
Club
Unknown

এটি আমরা যে আদেশ চাই তা নয় - আমরা তাদের গণনার ক্রমে চাই:

SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
    WHEN 4 THEN 0 --Unknown first
    WHEN 1 THEN 1 --Heart
    WHEN 3 THEN 2 --Club
    WHEN 2 THEN 3 --Diamond
    WHEN 0 THEN 4 --Spade
    ELSE 999 END

আপনি যদি স্ট্রিংগুলি সংরক্ষণ করেন তবে পূর্ণসংখ্যার মানগুলি সংরক্ষণ করে একই কাজের প্রয়োজন হয়:

SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name

Suit
-------
Club
Diamond
Heart
Spade
Unknown

তবে এটি আমরা যে আদেশ চাই তা নয় - আমরা তাদের গণনার ক্রমে চাই:

SELECT Suit FROM Cards
ORDER BY CASE Suit OF
    WHEN 'Unknown' THEN 0
    WHEN 'Heart'   THEN 1
    WHEN 'Club'    THEN 2
    WHEN 'Diamond' THEN 3
    WHEN 'Space'   THEN 4
    ELSE 999 END

আমার মতে এই ধরণের র‌্যাঙ্কিংটি ইউজার ইন্টারফেসের অন্তর্গত। আপনি যদি তাদের গণনার মানের উপর ভিত্তি করে আইটেমগুলি বাছাই করছেন: আপনি কিছু ভুল করছেন।

তবে আপনি যদি সত্যিই এটি করতে চেয়েছিলেন তবে আমি একটি Suitsমাত্রা সারণী তৈরি করব :

| Suit       | SuitID       | Rank          | Color  |
|------------|--------------|---------------|--------|
| Unknown    | 4            | 0             | NULL   |
| Heart      | 1            | 1             | Red    |
| Club       | 3            | 2             | Black  |
| Diamond    | 2            | 3             | Red    |
| Spade      | 0            | 4             | Black  |

এইভাবে, আপনি কিসিং কিংস নিউ ডেক অর্ডার ব্যবহার করতে আপনার কার্ডগুলি পরিবর্তন করতে চাইলে আপনি আপনার সমস্ত ডেটা ফেলে না রেখে প্রদর্শন উদ্দেশ্যে এটিকে পরিবর্তন করতে পারেন:

| Suit       | SuitID       | Rank          | Color  | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown    | 4            | 0             | NULL   | NULL      |
| Spade      | 0            | 1             | Black  | 1         |
| Diamond    | 2            | 2             | Red    | 1         |
| Club       | 3            | 3             | Black  | -1        |
| Heart      | 1            | 4             | Red    | -1        |

এখন আমরা একটি অভ্যন্তরীণ প্রোগ্রামিং বিশদ (গণনার নাম, গণনা মান) ব্যবহারকারীর জন্য প্রদর্শন প্রদর্শনের সাথে পৃথক করছি:

SELECT Cards.Suit 
FROM Cards
   INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank, 
   Card.Rank*Suits.CardOrder

23
টু স্ট্রিং প্রায়শই ডিসপ্লে মান প্রদান করতে ওভাররাইড হয়। নাম () এটির চেয়ে ভাল পছন্দ হিসাবে এটি সংজ্ঞা অনুসারে মান ওফ () এর প্রতিবিযুক্তি
ddimitrov

9
আমি এর সাথে দৃ this়ভাবে একমত নই, যদি এনাম অধ্যবসায়ের প্রয়োজন হয় তবে নামগুলি অবিচল হওয়া উচিত নয়। যতদূর এটি আবার পড়া যায় এটি নামের পরিবর্তে মান সহ আরও সহজ এটি কেবল টাইমকাস্ট করতে পারে সোমেনাম এনাম 1 = (সামারনাম) 2;
মামু

3
মামু: সংখ্যার সমতুল্য পরিবর্তন হলে কী হয়?
আয়ান বাল্ড

2
আমি এই পদ্ধতির ব্যবহার করে কাউকে নিরুৎসাহিত করব। স্ট্রিং উপস্থাপনায় নিজেকে বেঁধে দেওয়া কোডের নমনীয়তা এবং পুনরুদ্ধারকে সীমিত করে। আপনার অনন্য আইডির আরও ভাল ব্যবহার করা উচিত। স্ট্রিংয়ের অপচয়গুলি স্ট্রিংয়ের স্থান সঞ্চয় করে।
তুতবিদাস

2
@ লুইসগুভিয়া আমি আপনার সাথে একমত যে সময় দ্বিগুণ হতে পারে। 12.37 msপরিবর্তে নেওয়া একটি ক্যোয়ারী ঘটায় 12.3702 ms"গোলমালে" বলতে আমি এটাই বুঝি । আপনি আবার ক্যোয়ারী চালান এবং এটি লাগে 13.29 ms, বা 11.36 ms। অন্য কথায়, থ্রেড শিডিয়ুলারের এলোমেলোভাবে তাত্ত্বিকভাবে আপনার কাছে যে কোনও মাইক্রো অপ্টিমাইজেশন রয়েছে তা কোনওভাবেই কোনওভাবেই দৃশ্যমান নয় sw
ইয়ান বয়ড

42

এটি এড়ানোর জন্য আপনার নির্দিষ্ট কার্যকারিতা কারণ না থাকলে, আমি গণনার জন্য একটি পৃথক টেবিল ব্যবহার করার পরামর্শ দেব। অতিরিক্ত অনুসন্ধান আপনাকে সত্যিই মেরে না দেয় তবে বিদেশী কী সততা ব্যবহার করুন।

স্যুট টেবিল:

suit_id suit_name
1       Clubs
2       Hearts
3       Spades
4       Diamonds

খেলোয়াড়দের টেবিল

player_name suit_id
Ian Boyd           4
Shelby Lake        2
  1. আপনি যদি নিজের অঙ্কটিকে আচরণের (যেমন অগ্রাধিকারের) শ্রেণি হিসাবে চিহ্নিত করে থাকেন তবে আপনার ডাটাবেস ইতিমধ্যে এটি সঠিকভাবে মডেল করেছে
  2. আপনার ডিবিএ খুশি কারণ আপনার স্কিমাটি সাধারণীকরণ করা হয়েছে (পুরো স্ট্রিংয়ের পরিবর্তে প্রতি খেলোয়াড়ের জন্য একটি একক পূর্ণসংখ্যা সংরক্ষণ করা, এতে টাইপস থাকতে পারে বা নাও থাকতে পারে)।
  3. আপনার ডাটাবেস মানগুলি ( suit_id) আপনার গণনা মান থেকে স্বতন্ত্র, যা আপনাকে অন্যান্য ভাষার ডেটাতেও কাজ করতে সহায়তা করে।

14
আমি সম্মত হয়েছি যদিও এটি স্বাভাবিক করা ভাল, এবং ডিবিতে আবদ্ধ থাকায় এটি দুটি স্থানে আপডেটের ফলে একটি নতুন মান (কোড এবং ডিবি) যুক্ত করে যা আরও বেশি ওভারহেডের কারণ হতে পারে। এছাড়াও, যদি এনাম নাম থেকে সমস্ত আপডেটগুলি প্রোগ্রামক্রমে করা হয় তবে বানানের ভুলগুলি অস্তিত্বযুক্ত থাকতে হবে।
জেসন

3
আমি উপরের মন্তব্যে একমত ডাটাবেস পর্যায়ে একটি বিকল্প প্রয়োগকারী ব্যবস্থা হ'ল একটি সীমাবদ্ধ ট্রিগার লিখতে হবে, যা সন্নিবেশ বা আপডেটগুলিকে প্রত্যাখ্যান করবে যা কোনও অবৈধ মান ব্যবহার করার চেষ্টা করে।
স্টিভ পারকিনস

1
আমি কেন একই জায়গায় দুটি জায়গায় একই তথ্য ঘোষণা করতে চাই? কোডে public enum foo {bar}এবং CREATE TABLE foo (name varchar);এটি উভয়ই সহজে সিঙ্ক থেকে বেরিয়ে আসতে পারে।
ebyrob

যদি আমরা মুখের মান হিসাবে গৃহীত উত্তরটি গ্রহণ করি তবে তা হ'ল এনাম নামগুলি কেবল ম্যানুয়াল তদন্তের জন্য ব্যবহৃত হয়, তবে এই উত্তরটি অবশ্যই সেরা বিকল্প। এছাড়াও, যদি আপনি অঙ্কের ক্রম বা মান বা নাম পরিবর্তন করে যান তবে এই অতিরিক্ত সারণীটি বজায় রাখার চেয়ে আপনার সবসময় আরও অনেক সমস্যা হবে। বিশেষত যখন আপনার কেবলমাত্র ডিবাগিং এবং সমর্থন করার জন্য এটি প্রয়োজন (এবং কেবলমাত্র অস্থায়ীভাবে তৈরি করতে বেছে নিতে পারেন)।
afk5min

5

আমি যুক্তি দিয়ে বলব যে এখানে কেবলমাত্র নিরাপদ প্রক্রিয়াটি স্ট্রিংয়ের name()মানটি ব্যবহার করা । ডিবিতে লেখার সময়, আপনি মান সন্নিবেশ করতে একটি স্প্রোক ব্যবহার করতে পারেন এবং পড়ার সময় একটি ভিউ ব্যবহার করতে পারেন। এই পদ্ধতিতে, এনামগুলি পরিবর্তিত হলে, ডিবিতে "চাপিয়ে দেওয়া" না করে এনাম মান হিসাবে ডেটা উপস্থাপন করতে সক্ষম হওয়ার জন্য স্প্রোক / ভিউতে একটি স্তর নির্দেশনা রয়েছে।


1
আমি আপনার সমাধানের একটি হাইব্রিড পদ্ধতির এবং @ ইয়ান বয়ডের সমাধানটি খুব সাফল্যের সাথে ব্যবহার করছি। বখশিশের জন্য ধন্যবাদ!
টেকনোমোলজিকাল

5

যেমনটি আপনি বলেছেন, অর্ডিনাল কিছুটা ঝুঁকিপূর্ণ। উদাহরণস্বরূপ বিবেচনা করুন:

public enum Boolean {
    TRUE, FALSE
}

public class BooleanTest {
    @Test
    public void testEnum() {
        assertEquals(0, Boolean.TRUE.ordinal());
        assertEquals(1, Boolean.FALSE.ordinal());
    }
}

আপনি যদি এটি অর্ডিনাল হিসাবে সংরক্ষণ করেন তবে আপনার কাছে সারি থাকতে পারে:

> SELECT STATEMENT, TRUTH FROM CALL_MY_BLUFF

"Alice is a boy"      1
"Graham is a boy"     0

তবে আপনি বুলিয়ান আপডেট হলে কি হয়?

public enum Boolean {
    TRUE, FILE_NOT_FOUND, FALSE
}

এর অর্থ আপনার সমস্ত মিথ্যা 'ফাইল খুঁজে পাওয়া যায়নি' হিসাবে ভুল ব্যাখ্যা করা হবে

কেবল একটি স্ট্রিং প্রতিনিধিত্ব ব্যবহার করা ভাল


4

একটি বৃহত ডাটাবেসের জন্য আমি সংখ্যার উপস্থাপনের আকার এবং গতির সুবিধাগুলি হারাতে নারাজ। আমি প্রায়শই এনামকে উপস্থাপন করে একটি ডাটাবেস টেবিল দিয়ে শেষ করি।

আপনি একটি বিদেশী কী ঘোষণা করে ডাটাবেস ধারাবাহিকতা প্রয়োগ করতে পারেন - যদিও কিছু ক্ষেত্রে এটি বিদেশী কী বাধা হিসাবে ঘোষণা না করা ভাল, যা প্রতিটি লেনদেনের জন্য ব্যয় আরোপ করে। আপনি আপনার পছন্দের সময়ে, পর্যায়ক্রমে একটি চেক করে ধারাবাহিকতা নিশ্চিত করতে পারেন:

SELECT reftable.* FROM reftable
  LEFT JOIN enumtable ON reftable.enum_ref_id = enumtable.enum_id
WHERE enumtable.enum_id IS NULL;

এই সমাধানটির অন্য অর্ধেকটি এমন কিছু টেস্ট কোড লিখতে হবে যা পরীক্ষা করে যে জাভা এনুম এবং ডাটাবেস এনাম টেবিলের একই বিষয়বস্তু রয়েছে। এটি পাঠকের অনুশীলন হিসাবে ছেড়ে গেছে।


1
গড় গণনার নামের দৈর্ঘ্য 7 টি অক্ষর বলুন। আপনার enumIDচারটি বাইট, তাই আপনার নাম ব্যবহার করে প্রতি সারিতে অতিরিক্ত তিন বাইট রয়েছে। 3 বাইট এক্স 1 মিলিয়ন সারি 3MB।
ইয়ান বয়ড

@ আইয়ানবয়েড: তবে এটি enumIdঅবশ্যই দুটি বাইটে ফিট করে (জাভাতে দীর্ঘতর এনামগুলি সম্ভব নয়) এবং তাদের বেশিরভাগই একক বাইটে (যা কিছু ডিবি সমর্থন করে) ফিট করে। সংরক্ষিত স্থান নগণ্য, তবে দ্রুত তুলনা এবং নির্দিষ্ট দৈর্ঘ্যের সাহায্য করা উচিত।
মার্টিনাস

3

আমরা কেবল এনাম নাম নিজেই সঞ্চয় করি - এটি আরও পাঠযোগ্য।

আমরা এনামগুলির জন্য নির্দিষ্ট মানগুলি সংরক্ষণের সাথে গোলমাল করেছি, যেখানে মানগুলির একটি সীমিত সেট রয়েছে, উদাহরণস্বরূপ, এই এনামের স্ট্যাটাসগুলির একটি সীমিত সেট রয়েছে যা আমরা প্রতিনিধিত্ব করার জন্য একটি চর ব্যবহার করি (একটি সংখ্যার মানের চেয়ে আরও অর্থবহ):

public enum EmailStatus {
    EMAIL_NEW('N'), EMAIL_SENT('S'), EMAIL_FAILED('F'), EMAIL_SKIPPED('K'), UNDEFINED('-');

    private char dbChar = '-';

    EmailStatus(char statusChar) {
        this.dbChar = statusChar;
    }

    public char statusChar() {
        return dbChar;
    }

    public static EmailStatus getFromStatusChar(char statusChar) {
        switch (statusChar) {
        case 'N':
            return EMAIL_NEW;
        case 'S':
            return EMAIL_SENT;
        case 'F':
            return EMAIL_FAILED;
        case 'K':
            return EMAIL_SKIPPED;
        default:
            return UNDEFINED;
        }
    }
}

এবং যখন আপনার প্রচুর মান হয় তখন আপনার এনামের ভিতরে একটি মানচিত্র থাকা দরকার যা এই getFromXYZ পদ্ধতিটি ছোট রাখে।


আপনি যদি কোনও স্যুইচ বিবৃতি বজায় রাখতে না চান এবং dbChar অনন্য যে তা নিশ্চিত করতে পারেন আপনি যেমন কিছু ব্যবহার করতে পারেন: পাবলিক স্ট্যাটিক ইমেল স্ট্যাটাস getFromStatusChar (চর স্ট্যাটাসচার) {ফিরে Arrays.stream (ইমেলস্ট্যাটাস.ভেলুয়েস ()) ফিল্টার (ই ->) e.statusChar () == statusChar) .ফাইন্ড ফার্স্ট () .অরএলস (UNDEFINED); }
কুচি

2

ডাটাবেসে স্ট্রিং হিসাবে এনামগুলিকে সংরক্ষণ করা, আপনি কোনও এনামকে সিরিয়ালাইজ করতে (ডি) ইউটিলিটি পদ্ধতি তৈরি করতে পারেন:

   public static String getSerializedForm(Enum<?> enumVal) {
        String name = enumVal.name();
        // possibly quote value?
        return name;
    }

    public static <E extends Enum<E>> E deserialize(Class<E> enumType, String dbVal) {
        // possibly handle unknown values, below throws IllegalArgEx
        return Enum.valueOf(enumType, dbVal.trim());
    }

    // Sample use:
    String dbVal = getSerializedForm(Suit.SPADE);
    // save dbVal to db in larger insert/update ...
    Suit suit = deserialize(Suit.class, dbVal);

ডিসরিয়ালাইজে ফিরে এসে ডিফল্ট এনাম মান সহ এটি ব্যবহার করে খুব ভাল। উদাহরণস্বরূপ, ইলিজালআরজিএক্স ধরুন এবং স্যুট.নোন ফিরিয়ে দিন।
জেসন

2

আমার সমস্ত অভিজ্ঞতা আমাকে বলে যে যে কোনও জায়গায় এনামগুলিকে টিকিয়ে রাখার সবচেয়ে নিরাপদতম উপায় হ'ল অতিরিক্ত কোড মান বা আইডি (@ জিবি উত্তরের এক ধরণের বিবর্তন) ব্যবহার করা। এটি একটি ধারণার দুর্দান্ত উদাহরণ হতে পারে:

enum Race {
    HUMAN ("human"),
    ELF ("elf"),
    DWARF ("dwarf");

    private final String code;

    private Race(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

এখন আপনি আপনার এনাম কনস্ট্যান্টকে কোড দ্বারা উল্লেখ করে যে কোনও অধ্যবসায়ের সাথে যেতে পারেন। এমনকি যদি আপনি ধ্রুবক নামের কিছু পরিবর্তন করতে সিদ্ধান্ত নেব, আপনি সবসময় কোড মান যেমন রক্ষা করতে পারে ( DWARF("dwarf")থেকেGNOME("dwarf") )

ঠিক আছে, এই ধারণার সাথে আরও গভীরভাবে ডুব দিন। এখানে কিছু ইউটিলিটি পদ্ধতি রয়েছে যা আপনাকে কোনও এনাম মান সন্ধান করতে সহায়তা করে তবে প্রথমে আমাদের পদ্ধতির প্রসার ঘটাতে দিন।

interface CodeValue {
    String getCode();
}

এবং আমাদের এনাম এটি বাস্তবায়ন করুন:

enum Race implement CodeValue {...}

যাদু অনুসন্ধান পদ্ধতির জন্য এটি সময়:

static <T extends Enum & CodeValue> T resolveByCode(Class<T> enumClass, String code) {
    T[] enumConstants = enumClass.getEnumConstants();
    for (T entry : enumConstants) {
        if (entry.getCode().equals(code)) return entry;
    }
    // In case we failed to find it, return null.
    // I'd recommend you make some log record here to get notified about wrong logic, perhaps.
    return null;
}

এবং এটি একটি কবজ মত ব্যবহার করুন: Race race = resolveByCode(Race.class, "elf")


2

আমি একই সমস্যার মুখোমুখি হয়েছি যেখানে আমার উদ্দেশ্য হ'ল সাধারণ মানের পরিবর্তে এনাম স্ট্রিংয়ের মানটি ডাটাবেসে বজায় রাখা।

এই সমস্যাটি শেষ করতে আমি ব্যবহার করেছি @Enumerated(EnumType.STRING)এবং আমার উদ্দেশ্য সমাধান হয়ে গেছে।

উদাহরণস্বরূপ, আপনার একটি Enumক্লাস রয়েছে:

public enum FurthitMethod {

    Apple,
    Orange,
    Lemon
}

সত্তা শ্রেণিতে, সংজ্ঞা দিন @Enumerated(EnumType.STRING):

@Enumerated(EnumType.STRING)
@Column(name = "Fruits")
public FurthitMethod getFuritMethod() {
    return fruitMethod;
}

public void setFruitMethod(FurthitMethod authenticationMethod) {
    this.fruitMethod= fruitMethod;
}

আপনি যখন নিজের মানটি ডেটাবেজে সেট করার চেষ্টা করছেন, স্ট্রিংয়ের মানটি " APPLE", " ORANGE" বা " LEMON" হিসাবে ডাটাবেসগুলিতে স্থির থাকবে ।


1

এক, এনাম ক্ষেত্রের সাথে OR সম্পর্কের সাথে একাধিক মান। বাইট বা কোনও ইন্টির মতো ডাটাবেসে এনাম টাইপগুলি সংরক্ষণ করে এবং আপনার কোডে ফ্ল্যাগস্যাট্রিবিউট ব্যবহার করে .NET এর ধারণা।

http://blogs.msdn.com/b/efdesign/archive/2011/06/29/enumeration-support-in-entity-framework.aspx


0

আপনি এনাম ধ্রুবকটিতে একটি অতিরিক্ত মান ব্যবহার করতে পারেন যা এনামগুলির নাম পরিবর্তন এবং রিসর্ট উভয়ই বেঁচে থাকতে পারে:

public enum MyEnum {
    MyFirstValue(10),
    MyFirstAndAHalfValue(15),
    MySecondValue(20);

    public int getId() {
        return id;
    }
    public static MyEnum of(int id) {
        for (MyEnum e : values()) {
            if (id == e.id) {
                return e;
            }
        }
        return null;
    }
    MyEnum(int id) {
        this.id = id;
    }
    private final int id;
}

এনাম থেকে আইডিটি পেতে:

int id = MyFirstValue.getId();

একটি আইডি থেকে এনাম পেতে:

MyEnum e = MyEnum.of(id);

আমি এনাম নামগুলি পরিবর্তন করতে হলে বিভ্রান্তি এড়াতে কোনও অর্থহীন মান ব্যবহার করার পরামর্শ দিচ্ছি।

উপরের উদাহরণে, আমি "বেস সারি সংখ্যা নির্ধারণের" ফাঁকা স্থানগুলির কিছু বৈকল্পিক ব্যবহার করেছি যাতে সংখ্যাগুলি সম্ভবত এনামগুলিতে একই ক্রমে থাকবে।

এই সংস্করণটি সেকেন্ডারি সারণী ব্যবহার করার চেয়ে দ্রুত, তবে এটি কোড এবং উত্স কোড জ্ঞানের উপর নির্ভর করে।

তার প্রতিকারের জন্য, আপনি ডাটাবেসে এনাম আইডিসহ একটি টেবিল সেটআপ করতে পারেন। অথবা অন্য পথে যান এবং এনামগুলিতে কোনও সারণী থেকে সারি যুক্ত করার সাথে সাথে কোনও টেবিল থেকে আইডির বাছুন।

সিডিনোট : সর্বদা যাচাই করুন যে আপনি এমন কোনও ডিজাইন করছেন না যা একটি ডাটাবেস টেবিলের মধ্যে সংরক্ষণ করা উচিত এবং নিয়মিত বস্তু হিসাবে রক্ষণাবেক্ষণ করা উচিত। আপনি যদি ভাবতে পারেন যে এই মুহুর্তে আপনাকে এনামগুলিতে নতুন ধ্রুবক যুক্ত করতে হবে, আপনি যখন এটি স্থাপন করছেন, তখন এটি একটি ইঙ্গিত দেয় যে আপনি তার পরিবর্তে একটি নিয়মিত অবজেক্ট এবং টেবিল তৈরি করা ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.