การรักษา enum และตารางให้สอดคล้องกัน


11

ฉันกำลังสร้างโปรแกรมที่จะโพสต์ข้อมูลไปยังฐานข้อมูลและฉันได้ทำงานในรูปแบบที่ฉันแน่ใจว่าคุ้นเคย: ตารางสั้น ๆ ของค่าคงที่ที่มีแนวโน้มมากที่สุด ดังนั้นสมมติว่าตารางต่อไปนี้เรียกว่าStatus:

  สถานะ
  รหัสคำอธิบาย
  --------------
   0 ยังไม่ได้ประมวลผล
   1 รอดำเนินการ
   2 ประมวลผลแล้ว
   3 ข้อผิดพลาด

ในโปรแกรมของฉันฉันจำเป็นต้องกำหนดรหัสสถานะสำหรับตารางอื่นหรืออาจปรับปรุงระเบียนด้วยรหัสสถานะใหม่

ฉันสามารถ hardcode รหัสสถานะใน enum และหวังว่าจะไม่มีใครเปลี่ยนแปลงฐานข้อมูล หรือฉันจะ pre-เรียกค่าที่อยู่บนพื้นฐานของคำอธิบาย (ดังนั้น hardcoding ที่แทน)

อะไรจะเป็นวิธีที่ถูกต้องในการทำให้ทั้งสอง enum และตารางซิงค์กัน


เหตุใดคุณจึงเก็บสิ่งต่าง ๆ ให้ตรงกันและไม่ซิงค์กัน ซิงช์ (พูดแล้ว) มันแปลก!
MrFox

1
@suslik พวกเขาทั้งสองออกเสียงเหมือนกัน ซิงค์และการซิงค์
MPelletier

1
การมี enum และตารางฐานข้อมูลเป็นการทำซ้ำ หากไม่มีการใช้ตารางฐานข้อมูลโดยแอปพลิเคชั่นอื่น ๆ ฉันจะละทิ้งตารางและใช้ enum หากตารางจะถูกใช้ในหลายแอพให้โหลดสถานะจากฐานข้อมูลตอนรันไทม์แทน
ปีเตอร์สมิ ธ

มันขึ้นอยู่กับบริบท ในกรณีนี้เป็นเวิร์กโฟลว์หรือค่าสถานะงานฉันมักจะชอบที่จะทำให้พวกเขามีชีวิตชีวามากกว่าแบบคงที่เนื่องจากกระบวนการมักจะเปลี่ยนแปลง และมีแนวโน้มที่จะเปลี่ยนออกจากแบนด์สำหรับกำหนดการเปิดตัวซอฟต์แวร์ ในทางกลับกันหากบริการที่มีเสถียรภาพซึ่งไม่น่าจะมีรัฐใหม่ที่นำออกมาหรือรัฐที่มีอยู่ถูกลบออกไปฉันอาจถูกบังคับให้ใช้รหัสยาก enum / denormalize พวกเขามากขึ้น
JustinC

@PeterSmith ฐานข้อมูลไม่สามารถบังคับใช้ข้อ จำกัด หากอยู่ใน Java enum ของคุณเท่านั้นและไม่อยู่ในตาราง คุณกำลังจะ จำกัด ค่าในฐานข้อมูลของคุณใช่ไหม
David Conrad

คำตอบ:


5

ฉันจะเขียนโค้ด enum ภายในโปรแกรมของคุณเนื่องจากฉันสงสัยว่าสถานะที่แตกต่างเหล่านี้ส่งผลกระทบต่อตรรกะของโปรแกรมของคุณ หากคุณมีสถานะใหม่โปรแกรมของคุณควรตอบสนองอย่างไรกับสถานะใหม่นี้

เนื่องจากฐานข้อมูลเป็นส่วนหนึ่งของแอปพลิเคชันของคุณฉันไม่คิดว่าจะมีผลกระทบกับแอพพลิเคชั่นใด ๆ โดยไม่ปรึกษาผู้อื่นพูด


ไม่มากเกี่ยวกับสถานะใหม่ (ซึ่งแน่นอนจะรับประกันการเปลี่ยนแปลงทั้งฐานข้อมูลและโปรแกรม) แต่ค่า Id
MPelletier

2
ฉันไม่เห็นสาเหตุที่คุณจะเปลี่ยนค่า ID โดยไม่เปลี่ยนความหมาย การเรียงลำดับเหล่านี้จะไม่เพิ่มขึ้นอัตโนมัติและนี่เป็นเพียงการอ่านสำหรับผู้ที่ทำการดีบั๊กฐานข้อมูลโดยทั่วไปแล้วแอปพลิเคชันของคุณจะทำการสืบค้นและจะรู้ว่า ID สำหรับpendingนั้นเป็นอย่างไร แน่นอนว่าการมีStatusโต๊ะช่วยให้คุณมีความสมบูรณ์ในการอ้างอิง แต่นั่นก็เป็นจุดที่ฉันพยายามทำ
Matthew

ใช่นั่นคือความคิด แต่ถ้าฉันตั้ง ID ของที่หนึ่งไปยังที่อื่นฉันทำงานนอกสมมติฐานที่ว่าพวกเขาทั้งสองถูกต้อง มันเป็นลิงค์หลวมหรือเปล่า?
MPelletier

3
เราทำสมมติฐานเหล่านี้ตลอดเวลาหากคุณคิดถึงคำจำกัดความของตารางโปรแกรมของเราถือว่าคำนิยามนั้นเป็นเช่นนั้นเมื่อเขียนแบบสอบถาม Statusตารางไม่ควรได้รับการพิจารณาแบบไดนามิกผ่านรันไทม์ของโปรแกรมและทำให้ผมไม่คิดว่าคุณควรอ่านมันเป็นเช่นนี้
Matthew

8

ปกติฉันจะโหลดข้อมูลนี้เป็นแคชแบบสแตติก (โดยปกติจะอยู่ใน HashMap หรืออะไรทำนองนั้น) เมื่อแอปพลิเคชันเริ่มทำงาน มันหลีกเลี่ยงการคอมไพล์ซ้ำเพียงเพราะ enum ถูกแก้ไขในบางวิธี


2

เนื่องจากสิ่งเหล่านี้เป็นสถานะจึงควรเขียนโค้ดลงในแอปพลิเคชันเพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลงฐานข้อมูลจะทำให้โปรแกรมของคุณเสียหาย (อย่างน้อยก็ไม่สะดวก) สิ่งนี้มีความสำคัญเนื่องจากทุกสถานะที่ต้องเพิ่มจะต้องถูกเข้ารหัสก่อนและไม่ได้เพิ่มในฐานข้อมูล

คุณควรยังคงมีค่าสถานะเหล่านั้นที่เขียนไปยังฐานข้อมูลพร้อมคำอธิบายที่ถูกต้องในกรณีที่คุณต้องการดึงรายงานเช่น

ฉันมักจะมีข้อมูลโค้ดขนาดเล็กที่จะเชื่อมต่อกับฐานข้อมูลและตรวจสอบว่าสถานะที่แสดงในตารางที่ระบุทั้งหมดมีค่า id / ชื่อเดียวกับที่ฉันได้รับการกำหนดค่าตายตัวในหน่วยความจำ หากพวกเขาไม่ตรงกันฉันจะยกเลิกการดำเนินการของซอฟต์แวร์

ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการใช้พฤติกรรมที่แตกต่างกันเล็กน้อย แต่โดยรวมแล้วเป็นความคิดที่ดีที่จะมีสถานะเหล่านั้นอยู่ในฮาร์ดโค้ด


2

เรามีปัญหาที่คล้ายกันในโครงการของฉัน (รหัสดั้งเดิมไชโย!) ปัญหาที่สำคัญคือ "ตาราง enum ไม่เคยเปลี่ยนแปลง" จนกว่าพวกเขาจะทำและตัวแบ่งรหัส ฉันมีสองกลวิธีที่จะลดทอนการโยกย้ายเข้าหาฉันอย่างช้าๆ

อย่างแรกและดีที่สุดคือกำจัดการอ้างอิงโดยตรงไปยังค่าเหล่านี้ทุกครั้งที่ทำได้ ถามทุกครั้งว่า "ทำไมฉันต้องใช้ค่า enum โดยตรง" ในหลายกรณีนี่เป็นสัญญาณบ่งชี้ว่ารหัสมีการกำหนดรหัสฮาร์ดมากเกินไปหรือพยายามทำการบิดเบือนข้อมูลมากเกินไป ดูว่าคุณไม่สามารถสร้างความสัมพันธ์ที่ดีขึ้นในฐานข้อมูลหรือรหัสที่ยืดหยุ่นมากขึ้นเพื่อจัดการสิ่งที่กำลังถูกจัดการ

เมื่อไม่ได้ผลฉันจะไปที่แผน B: การสร้างรหัส เนื่องจากตารางเปลี่ยนไปไม่บ่อยนักและเราเผยแพร่การสร้างใหม่เป็นประจำตัวสร้างโค้ดสามารถอ่านตาราง enum และเขียนรหัส enum ไลบรารีที่สร้างขึ้นแบบไดนามิกนี้จะถูกใช้ในโครงการ หากฐานข้อมูลเปลี่ยนแปลงไปบิลด์ถัดไปจะไม่คอมไพล์ซึ่งดีกว่าการรับข้อผิดพลาดรันไทม์อย่างลึกลับ


คุณจะกำจัดการอ้างอิงไปยัง enum อย่างไร ตัวอย่างเช่นคุณกำลังเรียงลำดับหรือค้นหาตามสถานะในกรณีนี้ การมีค่าเวทมนตร์บางอย่างในฐานข้อมูลนั้นก็ไม่ได้อยู่กับฉันเช่นกัน นั่นคือสิ่งที่ตารางการค้นหามีไว้สำหรับ
nportelli

ในอดีตฉันได้ทำสิ่งที่ตรงกันข้าม เมื่อใดก็ตามที่มีการเปลี่ยนแปลงรหัสใน Enum ในการบูตแอปพลิเคชันจะซิงค์ค่าเหล่านั้นกับฐานข้อมูล นี่คือรหัสที่มาของความจริง ฐานข้อมูลเป็นตัวแทนของมัน โดยทั่วไปฉันไม่สนใจค่าใน DB ซึ่งรหัสไม่สามารถเข้าใจได้ แต่ด้วยวิธีนี้ฉันจะได้รับกลไกในการล้าง DB โดยอัตโนมัติหากจำเป็น
Anshul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.