การอ้างอิงค่าฐานข้อมูลในตรรกะทางธุรกิจ


43

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

1 Apple 
2 Banana 
3 Grapes

ฉันอาจนำเสนอให้กับผู้ใช้เขาเลือกหนึ่งมันจะถูกเก็บไว้ในโปรไฟล์ของเขาเป็น FavouriteFruit และ ID ที่เก็บไว้ในบันทึกของเขาในฐานข้อมูล

เมื่อพูดถึงกฎเกณฑ์ทางธุรกิจ / ลอจิกโดเมนอะไรคือคำแนะนำสำหรับการกำหนดตรรกะให้กับค่าเฉพาะ พูดถ้าผู้ใช้เลือกองุ่นฉันต้องการทำงานพิเศษบางอย่างวิธีที่ดีที่สุดในการอ้างอิงค่าองุ่นคือ:

// Hard coded name
if (user.FavouriteFruit.Name == "Grapes")

// Hard coded ID
if (user.FavoriteFruit.ID == 3) // Grapes

// Duplicate the list of fruits in an enum
if (user.FavouriteFruit.ID == (int)Fruits.Grapes)

หรืออย่างอื่น?

เนื่องจากแน่นอน FavouriteFruit จะถูกใช้ตลอดทั้งแอปพลิเคชันรายการอาจถูกเพิ่มหรือแก้ไข

บางคนอาจคิดว่าพวกเขาต้องการ 'Grapes' เปลี่ยนเป็น 'Grape' และนี่จะทำให้ตัวเลือกสตริงที่เข้ารหัสยาก

รหัส hardcoded ยังไม่ชัดเจนแม้ว่าดังที่แสดงไว้คุณสามารถเพิ่มความคิดเห็นเพื่อระบุรายการได้อย่างรวดเร็ว

ตัวเลือก enum เกี่ยวข้องกับการทำซ้ำข้อมูลจากฐานข้อมูลซึ่งดูเหมือนว่าผิดเนื่องจากอาจทำให้ข้อมูลไม่ตรงกัน

อย่างไรก็ตามขอขอบคุณล่วงหน้าสำหรับความคิดเห็นหรือข้อเสนอแนะ


1
ขอบคุณทุกคน: คำแนะนำและคำแนะนำทั่วไปมีประโยชน์จริง ๆ @RemcoGerlich ความคิดของคุณในการแยกข้อกังวลของสตริงที่ใช้สำหรับการแสดงผลและแยกเป็นรหัสการค้นหาสำหรับโค้ดที่อ่านได้มากขึ้นนั้นดีมาก
Kate

1
ฉันจะให้ @Mike Nakis คิดว่าวัตถุที่โหลดไว้ของคุณคิดว่าจะเป็นไปได้เพราะนี่เป็นสิ่งที่ดีที่สุดของทั้งสองโลก
Kate

1
ฉันอยากจะแนะนำการเปลี่ยนแปลงในวิธีแก้ปัญหาแรกของคุณ ให้ตารางของคุณมีคอลัมน์ที่ 3 สำหรับวิธีการประมวลผลและคุณใช้ฟิลด์นั้นเพื่อกำหนดรหัสที่จะเรียกใช้ ไม่ใช่ฟิลด์แสดงผลและสามารถใช้ร่วมกันระหว่างผลไม้หลายชนิด
กระตุ้น

1
ตัวเลือก enum เกี่ยวข้องกับการทำซ้ำข้อมูลจากฐานข้อมูลซึ่งดูเหมือนว่าผิดเนื่องจากอาจทำให้ข้อมูลไม่ตรงกัน ฉันชอบสิ่งนี้จริง มันเหมือนการบันทึกบัญชีสองครั้ง หากทั้งสองด้านของบัญชีแยกประเภทไม่สมดุลคุณจะรู้ว่ามีบางอย่างผิดปกติ มันทำให้การเปลี่ยนแปลงสิ่งต่าง ๆ โดยเจตนามากขึ้น
Radarbob

1
อืม ... ถ้ามีความสัมพันธ์แบบ 1: 1 ของ ID กับ String นี่คือสิ่งที่ซ้ำซ้อนและการมีทั้งคู่นั้นไม่มีจุดหมาย String สามารถใช้เป็นคีย์ DB ได้เช่นเดียวกับจำนวนเต็ม MyApplication.Grape.IDพูดติดอ่าง "Apple" ไม่ใช่ "Red_Apple" มากกว่า ID 3 ใด ๆ ก็เป็น 4 ดังนั้นความเป็นไปได้ในการเปลี่ยนชื่อ "Apple" เป็น "Red_Apple" ไม่สมเหตุสมผลกว่าการประกาศว่า 3 คือ 4 (และอาจเท่ากับ 3) จุดของ enum คือการแยก DNA ตัวเลขออกจากกัน ดังนั้นบางทีมันอาจจะถึงเวลาที่จะจริงๆแยกพลคีย์ DB สัมพันธ์ที่มีตัวอักษรไม่มีความหมายในรูปแบบธุรกิจหนึ่งของ
Radarbob

คำตอบ:


31

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

if( user.FavouriteFruit.ID == MyApplication.Grape.ID )

สิ่งที่เพิ่งเกิดขึ้นที่นี่คือฉันเห็นได้ชัดว่าโหลดทั้งแถวGrapeเข้าสู่หน่วยความจำดังนั้นฉันจึงมี ID ของมันพร้อมใช้ในการเปรียบเทียบ หากคุณบังเอิญใช้ Object-Relational Mapping (ORM) มันจะดูดีขึ้น:

if( user.FavouriteFruit == MyApplication.Grape )

(นั่นคือเหตุผลที่ฉันเรียกว่า "วัตถุที่โหลดไว้ล่วงหน้า")

ดังนั้นสิ่งที่ฉันทำคือในระหว่างการเริ่มต้นฉันโหลดตาราง "การแจงนับ" ทั้งหมดของฉัน (ตารางเล็ก ๆ เช่นวันในสัปดาห์เดือนของปีเพศและอื่น ๆ ) ลงในคลาสโดเมนแอปพลิเคชันหลัก ฉันโหลดพวกมันด้วยชื่อเพราะเห็นได้ชัดว่าMyApplication.Grapeต้องได้รับแถวที่เรียกว่า "องุ่น" และฉันยืนยันว่าพบพวกเขาทุกคน หากไม่มีเรามีข้อผิดพลาดรันไทม์ที่รับประกันในระหว่างการเริ่มต้นซึ่งเป็นข้อผิดพลาดอย่างน้อยที่สุดของข้อผิดพลาดรันไทม์ทั้งหมด


17
ฉันไม่เห็นด้วยกับคำตอบ แต่ฉันคิดว่าจำเป็นต้อง "หลีกเลี่ยงสายอักขระและค่าคงที่เวทย์มนตร์ที่ค่าใช้จ่ายทั้งหมด" ไม่เห็นด้วยกับส่วนที่เหลือของคำตอบซึ่งจริง ๆ แล้วต้องการให้คุณมีอย่างน้อยหนึ่งสถานที่ ในการเติม "วัตถุที่โหลดไว้ของคุณ" นั่นเป็นที่น่าสังเกตผมคิดว่าเพราะมีมีวิธีในการหลีกเลี่ยง "สตริงและค่าคงที่วิเศษ" อย่างสิ้นเชิง แต่ก็มักจะ obfuscating กว่าก็คุ้มค่า ...
svidgen

2
@svidgen คุณจะไม่เห็นด้วยว่ามีความแตกต่างพื้นฐานระหว่างการกระเจิงการผูก - ชื่อโดยทั่วทุกที่เทียบกับการผูกโดยชื่อเพียงครั้งเดียวเพื่อโหลดเนื้อหาของบันทึกที่มีชื่อเดียวกันและทำเท่านั้น เมื่อเริ่มต้นซึ่งข้อผิดพลาดรันไทม์เกือบจะเป็นพิษเป็นภัยเป็นข้อผิดพลาดในการรวบรวม? อย่างไรก็ตามวิธีหลีกเลี่ยงแม้แต่การผูกชื่อเพียงเล็กน้อยก็น่าสนใจอยู่เสมอแม้จะมีความงงงวยที่คุณพูดถึงดังนั้นฉันอยากรู้ว่าคุณได้ยินอะไรในใจ
Mike Nakis

โอ้ฉันเห็นด้วยอย่างสมบูรณ์ และด้วยลักษณะของ OP ฉันขอแนะนำเพียงคำตอบนี้จะได้ประโยชน์จากการเปลี่ยน "ทุกค่าใช้จ่าย" เป็น "เมื่อใดก็ตามที่เป็นไปได้และเป็นไปได้" หรือสิ่งที่คล้ายกัน ... ถ้าฉันมีเวลามากขึ้นเพื่อความสมบูรณ์เท่านั้นฉันจะเขียนคำตอบที่เกี่ยวข้องกับเรื่องไร้สาระ metaprogramming ... แต่นั่นไม่ใช่สิ่งที่ OP (หรือใครก็ตามในกรณีส่วนใหญ่) อาจต้องการ . แต่การแก้ปัญหา metaprogamming จะสอดคล้องมากขึ้นกับคำสั่งแรกของคุณตามที่เป็นอยู่
svidgen

1
@ user469104 ความแตกต่างคือรหัสอาจเปลี่ยนแปลงและแอปพลิเคชันจะยังคงโหลดแถวทั้งหมดอย่างถูกต้องและทำการเปรียบเทียบทั้งหมดอย่างถูกต้อง นอกจากนี้คุณมีอิสระในการ refactor รหัสและเปลี่ยนชื่อแถวในสิ่งที่คุณต้องการและที่เดียวที่คุณต้องไปหาสิ่งที่จะแก้ไขคือในการเริ่มต้นของโปรแกรมและมันก็ชัดเจนมาก: Grape = fetchRow( Fruit.class, NameColumn, "Grape" ); และถ้าคุณ ทำสิ่งที่ไม่ถูกต้องAssertionErrorจะแจ้งให้คุณทราบ
Mike Nakis

1
@grahamparks ไม่มากไปกว่าenumนั้นจะเป็นสายเวท ประเด็นก็คือความเข้มข้นของทั้งหมดที่มีผลผูกพันตามชื่อในเวลาเพียงหนึ่งในสถานที่ , การตรวจสอบของมันทั้งหมดระหว่างการเริ่มต้นและประเภทความปลอดภัย
Mike Nakis

7

การตรวจสอบกับสตริงเป็นสิ่งที่อ่านได้มากที่สุด แต่ทำหน้าที่สองอย่าง: มันถูกใช้ทั้งเป็นตัวระบุและคำอธิบาย (ซึ่งอาจเปลี่ยนแปลงได้ด้วยเหตุผลที่ไม่เกี่ยวข้อง)

ฉันมักจะแบ่งหน้าที่ทั้งสองเป็นสาขาที่แยกกัน:

id  code    description
 1  grape   Grapes
 2  apple   Apple

คำอธิบายอาจเปลี่ยนแปลงได้ (แต่ไม่ใช่ "Grapes" เป็น "Banana") แต่ไม่อนุญาตให้เปลี่ยนรหัสได้

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

นอกจากนี้วิธีการที่มักจะมีคนจริงๆแก้ไข "องุ่น" กับ "องุ่น"? บางทีสิ่งนี้ไม่จำเป็นเลย


8
ฉันไม่คิดว่าซ้ำซ้อนยังเพิ่มเติมคือคำตอบ ...
ร็อบบี้ดี

4
ฉันได้พิจารณาตัวเลือกนี้เช่นกันและฉันได้ลองแล้ว แต่นี่คือสิ่งที่เกิดขึ้น: ในบางจุด "แอปเปิ้ล" ก็ต้องแตกต่างออกไปเป็น "green_apple" และ "red_apple" แต่เนื่องจาก "แอปเปิ้ล" ถูกใช้ในสถานที่จำนวนมากในรหัสแล้วฉันไม่สามารถเปลี่ยนชื่อได้ดังนั้นฉันจึงต้องมี "แอปเปิ้ล" และ "green_apple" และด้วยเหตุนี้เชลดอนในตัวฉันจึงห้ามไม่ให้ฉันนอนหลับเป็นเวลาหลายคืนจนกระทั่งฉันเข้าไปที่นั่นและทำให้ทุกอย่างกลับเป็น "วัตถุที่โหลดไว้ล่วงหน้า" (ดูคำตอบของฉัน)
Mike Nakis

1
ฉันชอบวัตถุที่โหลดไว้ล่วงหน้าของคุณแน่นอน แต่ถ้า "แอปเปิ้ล" ของคุณแตกต่างคุณไม่ต้องไปทำทุกอย่างเลยวิธีใดที่คุณเลือก
RemcoGerlich

คุณอาจมีตารางแยกต่างหากสำหรับชื่อคำอธิบายเพื่อรองรับความเป็นสากล
Erik Eidt

1
@ MikeNakis และ Refactoring นั้นเป็นส่วนสำคัญในการค้นหาและแทนที่ Codebase ทั้งหมดของคุณแทนที่ Fruit.Apple ด้วย Fruit.GreenApple ถ้าฉันใช้ค่า Hardcoded String ฉันจะทำการค้นหาและแทนที่เหนือ Codebase ทั้งหมดเพื่อแทนที่ "apple" ด้วย "green_apple" ซึ่งใกล้เคียงกัน - การปรับโครงสร้างจะรู้สึกดีขึ้นเพราะ IDE กำลังทำการแทนที่
Falco

4

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

รูปแบบบางอย่างที่ฉันได้เห็น:

  • Enums + ค่าเริ่มต้นเพื่อป้องกันรายการฐานข้อมูลใหม่ที่ทำลายวันโปรแกรมของคุณ
  • การเข้ารหัสการกระทำที่ต้องทำ (ตรรกะบิซ) ในฐานข้อมูลนั้น ในหลายกรณีนี้เป็นไปได้มากเพราะ logics หลายคนได้รับการใช้ซ้ำ การดำเนินการตามตรรกะควรอยู่ในโปรแกรม
  • คุณลักษณะ / คอลัมน์เพิ่มเติมในฐานข้อมูลเพื่อทำเครื่องหมายมูลค่าใหม่เป็น 'to-be-be' ในโปรแกรมจนกระทั่งโปรแกรมถูกปรับใช้
  • ล้มเหลวอย่างรวดเร็วกลไกรอบ ๆ เส้นทางรหัสที่โหลด / โหลดใหม่ค่าจากฐานข้อมูล (หากการกระทำที่เกี่ยวข้องไม่ได้อยู่ในโปรแกรมและไม่ได้ทำเครื่องหมายว่าไม่ต้องทำโปรดอย่ารีเฟรช)

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


4

การจัดเก็บไว้ในทั้งสองที่ (ในตารางและใน ENUM) นั้นไม่เลว เหตุผลมีดังต่อไปนี้:

โดยการจัดเก็บไว้ในตารางฐานข้อมูลเราสามารถบังคับใช้ Referential Integrity ในฐานข้อมูลผ่านทาง Foreign Key ดังนั้นเมื่อคุณเชื่อมโยงบุคคลหรือเอนทิตีอะไรก็ตามกับผลไม้มันเป็นเพียงผลไม้ที่มีอยู่ในตารางฐานข้อมูล

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

สิ่งหนึ่งเมื่อกำหนด ENUM แล้วอย่าเปลี่ยนค่าของมัน ตัวอย่างเช่นหากคุณมี:

  • แอปเปิ้ล
  • องุ่น

อย่าเปลี่ยนชื่อองุ่นเป็นองุ่น เพียงเพิ่ม ENUM ใหม่

  • แอปเปิ้ล
  • องุ่น
  • องุ่น

หากคุณต้องการโอนย้ายข้อมูลให้ใช้การอัปเดตเพื่อย้ายองุ่นทั้งหมดไปยังองุ่น


เป็นขั้นตอนต่อไปที่ฉันได้ทำงานในร้านค้าที่มีค่าเมทาดาทามีค่าสถานะลบในตารางเพื่อระบุว่าไม่ควรใช้ (พวกเขาอาจเลิกใช้แล้วหรือมีรุ่นที่ใหม่กว่า)
Robbie Dee

1

คุณถูกต้องที่จะถามคำถามนี้มันเป็นคำถามที่ดีจริงๆเมื่อคุณพยายามป้องกันการประเมินสภาพที่ไม่ถูกต้อง

ที่กล่าวว่าการประเมินผล ( ifเงื่อนไขของคุณ) ไม่จำเป็นต้องเป็นจุดสนใจของวิธีการที่คุณได้รับมัน ให้ระวังวิธีที่คุณเผยแพร่การเปลี่ยนแปลงที่จะทำให้เกิดปัญหา 'ไม่ซิงค์'

วิธีการแบบสตริง

หากคุณต้องใช้สตริงทำไมไม่เปิดเผยฟังก์ชั่นการเปลี่ยนรายการผ่าน UI? การออกแบบระบบเพื่อให้อยู่กับการเปลี่ยนแปลงGrapeที่จะยกตัวอย่างเช่นคุณอัปเดตทั้งหมดของระเบียนปัจจุบันอ้างอิงGrapesGrape

วิธีการ ID

ฉันต้องการอ้างอิง ID เสมอแม้ว่าจะมีการอ่านง่าย The list may be added toสามารถเป็นสิ่งที่คุณจะได้รับแจ้งอีกครั้งหากคุณเปิดเผยคุณสมบัติ UI ดังกล่าว หากคุณกังวลเกี่ยวกับการจัดเรียงรายการที่เปลี่ยน id ให้เผยแพร่การเปลี่ยนแปลงดังกล่าวไปยังระเบียนที่ต้องพึ่งพาทั้งหมดอีกครั้ง ในทำนองเดียวกันกับข้างต้น ตัวเลือกอื่น (ทำตามแบบแผนการฟื้นฟูที่เหมาะสมจะต้องมีคอลัมน์ enum / id ของคุณ - และอ้างอิงFruitDetailตารางรายละเอียดเพิ่มเติมซึ่งมีคอลัมน์ 'คำสั่งซื้อ' ที่คุณสามารถค้นหาได้)

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


1
ในฐานข้อมูลรหัสตัวเลขจะถูกจัดเก็บไว้สำหรับระเบียนลูกโดยเฉพาะเพื่อหลีกเลี่ยงปัญหานั้น คำถามนี้เกี่ยวกับวิธีการติดต่อกับภาษาการเขียนโปรแกรม
Clockwork-Muse

1
@ Clockwork-Muse - เพื่อหลีกเลี่ยงปัญหาใด? ไม่สมเหตุสมผลเลย
JᴀʏMᴇᴇ

ฉันใช้วิธีการ ID ค่อนข้างน้อย แต่ ID ถูกล็อคและไม่สามารถเปลี่ยนแปลงได้ สตริงที่แนบมาของหลักสูตรสามารถเพราะคนมักจะต้องการเปลี่ยนชื่อสิ่งที่ "รถบรรทุก" กลายเป็น "รถบรรทุก" ฯลฯ ในขณะที่สิ่งที่ตัวเอง (แสดงโดย ID) จะไม่เปลี่ยนแปลง
Brian Knoblauch

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

ไม่จำเป็นต้องเพิ่มอัตโนมัติ ไม่ควรในกรณีนี้โดยเฉพาะอย่างยิ่งหากเป็นจำนวนเต็มพื้นฐานของ enum ที่เราใช้
JᴀʏMᴇᴇ

0

ปัญหาที่พบบ่อยมาก ในขณะที่การทำซ้ำด้านไคลเอนต์ข้อมูลอาจดูเหมือนละเมิดหลักการDRYแต่เป็นเพราะความแตกต่างในกระบวนทัศน์ระหว่างเลเยอร์

มี enum (หรืออะไรก็ตาม) ออกจากขั้นตอนกับฐานข้อมูลไม่จริงที่ผิดปกติอย่างใดอย่างหนึ่ง คุณอาจผลักดันค่าอื่นให้กับตารางข้อมูลเมตาเพื่อสนับสนุนคุณลักษณะรายงานใหม่ที่ยังไม่ได้ใช้ในรหัสฝั่งไคลเอ็นต์

บางครั้งมันก็เกิดขึ้นด้วยวิธีอื่นเช่นกัน ค่า enum ใหม่ถูกเพิ่มเข้ากับฝั่งไคลเอ็นต์ แต่การอัพเดต DB ไม่สามารถเกิดขึ้นได้จนกว่าจะถึงเวลาที่ DBA สามารถใช้การเปลี่ยนแปลงได้


ใช่คุณอธิบายปัญหาแล้ว ทางออกของคุณคืออะไร?
ผู้พิทักษ์คนที่

1
@Protectorone คุณถือว่ามีเป็นวิธีการแก้ปัญหา bullet เงินซึ่งเป็นสมมติฐานที่ผิดพลาดในประสบการณ์ของผม สิ่งที่ดีที่สุดที่คุณคาดหวังได้ก็คือองค์กรธุรกิจบางแห่งเป็นเจ้าของโดเมนปัญหาดังนั้นอย่างน้อยคุณจะเห็นว่าด้านใดที่ล้าหลัง - ฝั่งไคลเอ็นต์หรือด้านฐานข้อมูล การเงินและการธนาคารโดยทั่วไปจะมีประสิทธิภาพมากในเรื่องนี้กับภาคธุรกิจค้าปลีกเป็นอย่างเห็นได้ชัดน้อยดังนั้น ...
ร็อบบี้ดี

0

สมมติว่าเรากำลังพูดถึงสิ่งที่เป็นหลักการค้นหาแบบคงที่แล้วตัวเลือกที่สาม - enum - นั้นเป็นทางเลือกที่มีเหตุผลเท่านั้น มันคือสิ่งที่คุณจะทำถ้าฐานข้อมูลไม่เกี่ยวข้องดังนั้นจึงสมเหตุสมผล

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

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


1
ฉันไม่เชื่อว่าสิ่งเหล่านี้เป็นเพียงการค้นหาแบบสแตติกมิฉะนั้นพวกเขาอาจถูกดึงออกจากฐานข้อมูลและใช้ตามที่เป็นอยู่ ปัญหาที่ฉันเข้าใจคือเมื่อต้องใช้ตรรกะทางธุรกิจขึ้นอยู่กับค่าการค้นหาที่ใช้ แต่ที่นอกเหนือกันใช่ - enums โดยทั่วไปจะใช้เพื่อการนี้
Robbie Dee

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