แนวทางปฏิบัติที่ดีที่สุดของ Rails - ที่อยู่ถาวรใน PostgreSQL

ส่วนขยาย 'hstore' นำไปใช้กับชนิดข้อมูล 'hstore' สำหรับการจัดเก็บชุดของคู่ของคีย์ / ค่า

บทคัดย่อ: เสนอวิธีการแก้ปัญหาที่นำเสนอวิธีการจัดเก็บและเรียกใช้ข้อมูลที่ซับซ้อนจากฐานข้อมูล SQL

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

ที่อยู่อะไร

นี่คือลักษณะที่อยู่ทั่วไปในสหรัฐอเมริกา:

ที่อยู่: [
ถนน: สตริง“ 123 Happy Days Lane”
เมือง: สตริง "วันเดอร์แลนด์"
สถานะ: สตริง“ PA”
รหัสไปรษณีย์: 10102
]

ค่า“ ที่อยู่” ประกอบด้วยอาร์เรย์ของคู่คีย์ / ค่าโดยที่ค่าคือสตริง มันเป็นฟิลด์ทั่วไปที่จะเห็นในแอปพลิเคชัน ดังนั้นวิธีที่ดีที่สุดในการแสดงค่า“ ที่อยู่” ในฐานข้อมูล SQL คืออะไร หากต้องการทราบว่าผู้พัฒนารายอื่นทำอะไรในสถานการณ์นี้

ตัวเลือก 1: เก็บค่าในเขตข้อมูลเดียวเป็นสตริงตัวอย่างเช่น:

ที่อยู่:“ 123 Happy Days Ln Wonderland, PA 10102”

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

ตัวเลือกที่ 2: แบ่งค่า“ ที่อยู่” ออกเป็นเขตข้อมูลที่แตกต่างกันและจัดเก็บเขตข้อมูลเหล่านั้นตัวอย่างเช่น

ถนน:“ 123 Happy Days Ln”, เมือง:“ Wonderland”, รัฐ:“ PA”, Zip:“ 10102”

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

ตัวเลือก 3: สร้างตารางที่อยู่แยกต่างหากและการเชื่อมโยงคีย์ต่างประเทศ

คำตอบบล็อกโพสต์และ StackOverflow หลายคำตอบสรุปว่าวิธีที่ดีที่สุดในการจัดเก็บที่อยู่ใน Rails คือการใช้รูปแบบที่แยกต่างหากและการเชื่อมโยงกับไอเท็ม ด้วยวิธีนี้โมเดลผู้ใช้หรือธุรกิจอาจมีที่อยู่จำนวนมากและไม่ จำกัด อยู่เพียงที่เดียว นอกจากนี้ที่อยู่จะถูกจัดเก็บอย่างเหมาะสมเนื่องจากแต่ละรุ่น“ ที่อยู่” จะประกอบด้วยรหัสและค่าที่เกี่ยวข้อง นี่ไม่ใช่โซลูชันที่ไม่ดีโดยสมมติว่ารูปแบบแอปพลิเคชันของคุณเช่น "ผู้ใช้" เรียกใช้ที่อยู่หลายแห่ง อย่างไรก็ตามหากแต่ละรุ่นต้องการเพียงที่อยู่เดียว (เช่นกรณีของคนส่วนใหญ่ที่อยู่ทางไปรษณีย์) โดยการเพิ่มตารางและการเชื่อมโยงเพิ่มเติมคุณจำเป็นต้องเพิ่มความซับซ้อนของแอปพลิเคชันโดยไม่จำเป็น การสร้างตารางและการเชื่อมโยงใน Rails ค่อนข้างง่ายซึ่งอาจเป็นเหตุผลเบื้องหลังตัวเลือกที่สามนี้ ในการสร้างตาราง "ที่อยู่" ใหม่ที่มีการเชื่อมโยงที่เหมาะสมกับ "ผู้ใช้" นั้นง่ายเหมือน: rails g model ที่อยู่ถนน: เมืองสตริง: รัฐสตริง: สตริงไปรษณีย์: ผู้ใช้สตริง: การอ้างอิงคำถามนั้นกลายเป็น "ดีที่สุด ฝึกหัดสำหรับแอปพลิเคชันของคุณหรือนี่เป็นวิธีแก้ปัญหาที่ซับซ้อนกว่านี้หรือไม่”

วิธีการแก้:

Rails / PostgreSQL เป็นเทคโนโลยีสแต็คทั่วไปที่ใช้ในการพัฒนาและการผลิต มีวิธีการจัดเก็บที่อยู่ในรูปแบบที่เหมาะสมโดยเปิดใช้งานส่วนขยาย "hstore" ส่วนขยายนี้ช่วยให้เราสามารถบันทึกข้อมูลเป็นประเภท "hstore" (hash store) ขั้นตอนแรกคือการเปิดใช้งานโมดูล "hstore" ในการทำเช่นนี้เราจะเขียนการย้ายข้อมูล:

เมื่อเรารัน 'rails db: migrate' จากบรรทัดคำสั่ง Postgres จะเปิดใช้งานส่วนขยาย 'hstore' สิ่งนี้สามารถตรวจสอบได้โดยตรวจสอบไฟล์ schema.rb ใกล้ด้านบนของไฟล์คุณควรเห็น:

 # นี่คือส่วนขยายที่ต้องเปิดใช้งานเพื่อสนับสนุนฐานข้อมูลนี้
enable_extension“ plpgsql”
enable_extension“ hstore”

ต่อไปเราจะสร้างการย้ายข้อมูลสำหรับรุ่นผู้ใช้:

สังเกตว่าเราใช้ 'hstore' ประเภทข้อมูลสำหรับช่องที่อยู่อย่างไร สิ่งนี้ช่วยให้เราสามารถจัดเก็บคู่คีย์ / ค่าภายใน "ที่อยู่"

ด้านข้าง: ฟิลด์ 'hstore' สามารถใช้เพื่อเก็บคู่คีย์ / ค่าใด ๆ ในบทความนี้เรากำลังสำรวจ "ที่อยู่" แต่มันก็มีประโยชน์สำหรับการจัดเก็บ "การตั้งค่า" หรือประเภทข้อมูลแฮชอื่น ๆ

ดังนั้นตอนนี้เรามีเขตข้อมูลเดียวที่เรารู้ว่าสามารถเก็บข้อมูลในรูปแบบของ City =>“ Wonderland” และ State =>“ PA” เราสามารถสร้างโมเดล "ผู้ใช้" และตัวควบคุม "ผู้ใช้" แต่เราจะบันทึกคู่คีย์ / ค่าลงในฟิลด์ฐานข้อมูลเดียวได้อย่างไร มีสิ่งอื่นที่ต้องพิจารณาอีกประการหนึ่งเราจะคงคู่คีย์ / ค่าของ City =>“ Wonderland” ไว้ในฟิลด์ของ“ ที่อยู่” ได้อย่างไร?

จากมุมมองของตัวควบคุมเราต้องทำรายการพารามิเตอร์ใด ๆ ในรายการที่ปลอดภัยก่อนที่พวกเขาจะได้รับมอบหมายจำนวนมาก สิ่งนี้ทำในวิธีการส่วนตัว 'user_params' เช่นเดียวกับฟิลด์ฐานข้อมูลอื่น ๆ

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

ในแบบฟอร์มผู้ใช้ของเราเรามีฟิลด์ที่เหมาะสมในการรวบรวมข้อมูล:

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

แบบฟอร์มด้านบนแสดงในเบราว์เซอร์

เราสามารถสร้างผู้ใช้อย่างรวดเร็วและดูว่าฟิลด์“ ที่อยู่” มีลักษณะอย่างไร:

ฟิลด์ที่อยู่จะถูกบันทึกเป็นแฮชของคู่คีย์ / ค่าสมบูรณ์แบบ!

ในภาพด้านบนคำว่า "หัวเรื่อง" มีความหมายเหมือนกันกับ "ผู้ใช้" ดังที่คุณเห็นฟิลด์ "ที่อยู่" ได้บันทึกคู่คีย์ / ค่าของเราจากคอนโทรลเลอร์เหมือนที่เราคาดไว้ หากเราต้องการค้นหาคุณค่าของเมืองที่ผู้ใช้สามารถใช้ได้ @ user.address ['city'] และสิ่งนี้จะส่งคืน“ Wonderland” ในตัวอย่างการใช้งานของเรา

ในบทความนี้เราค้นพบวิธีการที่เหมาะสมที่สุดสำหรับการบันทึกและการสืบค้นชนิดข้อมูลที่ซับซ้อนใน PostgreSQL ผ่านทางส่วนขยาย 'hstore' เราได้พิจารณาแล้วว่าวิธีปฏิบัติที่ดีที่สุดขั้นตอนแรกในการสร้างเว็บแอปพลิเคชันคือการวางแผนและรวบรวมข้อมูล นอกจากนี้เรายังได้เรียนรู้คุณค่าของการค้นพบข้อมูลด้วยตนเองโดยการค้นคว้าและอ่านเอกสาร เพียงเพราะนักพัฒนาซอฟต์แวร์หรือ บริษัท อื่นทำสิ่งเดียวที่ไม่ได้หมายความว่าเราควรติดตามอย่างสุ่มสี่สุ่มห้า สิ่งสำคัญคือการตั้งคำถามว่า“ ทำไม” และใช้ความสามารถทางปัญญาของเราเองเพื่อสรุปข้อสรุปอย่างมีเหตุผล ฉันหวังว่าคุณจะพบบทความนี้เป็นประโยชน์ สำหรับข้อมูลเพิ่มเติมและแบบฝึกหัดเกี่ยวกับเทคโนโลยีเว็บให้เยี่ยมชม Learn2Code