Rails Thực hành tốt nhất - Địa chỉ liên tục trong PostgreSQL

Tiện ích mở rộng ‘hstore và triển khai kiểu dữ liệu‘ hstore của Google để lưu trữ các cặp khóa / giá trị

Tóm tắt: đề xuất một giải pháp cung cấp một phương pháp nhất quán, hiệu quả và đáng tin cậy để lưu trữ và truy xuất các kiểu dữ liệu phức tạp từ cơ sở dữ liệu SQL.

Lập kế hoạch ứng dụng là một bước quan trọng và thường bị bỏ qua trong việc xây dựng các ứng dụng web thành công. Khung công tác Rails giúp dễ dàng tạo và khởi động một ứng dụng mà nó hấp dẫn cho các nhà phát triển bỏ qua việc lập kế hoạch và chuyển ngay sang phát triển. Tuy nhiên, việc tạo mã ứng dụng trước khi lập kế hoạch đúng cho tên miền có thể dẫn đến các ứng dụng cẩu thả hoặc thậm chí không đúng định dạng. Ví dụ, hãy xem xét phương pháp tốt nhất để xử lý trường địa chỉ của Cameron trong một ứng dụng.

Những gì trong một địa chỉ?

Ở đây, một địa chỉ điển hình trông như thế nào ở Hoa Kỳ:

Địa chỉ nhà: [
Đường: Số 123 Chúc mừng ngày Lane Lane String String
Thành phố: Chuỗi Wonderland
Bang: chuỗi PA PA String
Zip: 10102 Chuỗi
]

Giá trị địa chỉ của điểm số bao gồm một chuỗi các cặp khóa / giá trị, trong đó giá trị là một chuỗi. Nó là một lĩnh vực rất phổ biến để xem trong các ứng dụng. Vì vậy, cách nào là cách tốt nhất để thể hiện giá trị của địa chỉ trực tuyến trong cơ sở dữ liệu SQL? Để tìm ra điều này, hãy để xem xét những gì các nhà phát triển khác làm trong tình huống này.

Tùy chọn 1: Lưu trữ giá trị trong một trường dưới dạng một chuỗi, ví dụ:

Địa chỉ: Số 123 Chúc mừng ngày Ln. Wonderland, PA 10102

Đây là một giải pháp kém. Như chúng ta đã thấy trong phần trên, một địa chỉ là một mảng các cặp khóa / giá trị. Để xử lý địa chỉ như bất kỳ trường vô hướng nào khác sẽ không nhất quán. Sự không nhất quán này trở nên rõ ràng khi chúng tôi muốn mở rộng ứng dụng tại một thời điểm nào đó trong tương lai. Hãy để chúng tôi nói rằng chúng tôi muốn tìm tất cả các khách hàng từ một thành phố đã được đưa ra. Bởi vì toàn bộ giá trị của Địa chỉ mạng đã được đặt trong một chuỗi ở đó, không còn là một cách dễ dàng để làm điều này.

Tùy chọn 2: Chia giá trị của Địa chỉ mạng thành các trường riêng biệt và lưu trữ các trường đó, ví dụ:

Đường: Tối 123 Chúc mừng ngày vui Ln, Thành phố: Điên Wonderland, Bang: Điên PA, Zip: Hồi 10102

Ở đây, chúng tôi đã giải quyết phần mở rộng giả thuyết trước đây của chúng tôi về việc tìm kiếm tất cả khách hàng của một Thành phố đặc biệt hoặc Thành phố trực tuyến. Tuy nhiên, hiện tại, chúng tôi đại diện cho trường Địa chỉ liên lạc là bốn trường riêng biệt và thực tế khi các trường nên được kết hợp với nhau.

Tùy chọn 3: Tạo bảng Địa chỉ riêng và liên kết khóa ngoài

Một số bài đăng trên blog và câu trả lời StackOverflow kết luận rằng cách tốt nhất để lưu trữ địa chỉ trong Rails là sử dụng một mô hình riêng biệt và liên kết thuộc về. Theo cách này, mô hình Người dùng hoặc Doanh nghiệp có thể có nhiều địa chỉ và không giới hạn ở một địa chỉ. Ngoài ra, các địa chỉ sẽ được lưu trữ chính xác vì mỗi mô hình Địa chỉ liên lạc của người dùng sẽ bao gồm các khóa và các giá trị tương ứng. Đây không phải là một giải pháp kém, giả sử rằng mô hình ứng dụng của bạn, ví dụ, người dùng, người dùng, gọi cho một số địa chỉ. Tuy nhiên, nếu mỗi mô hình chỉ cần một địa chỉ (như trường hợp của phần lớn mọi người, một địa chỉ gửi thư) thì bằng cách thêm các bảng và liên kết bổ sung mà bạn không cần phải tăng độ phức tạp của ứng dụng. Nó rất đơn giản để tạo các bảng và liên kết trong Rails, đó có thể là lý do đằng sau tùy chọn thứ ba này. Để tạo một bảng "Địa chỉ trực tuyến với sự liên kết phù hợp với Người dùng trực tuyến, đơn giản như: rails g model Địa chỉ đường phố: chuỗi thành phố: chuỗi trạng thái: chuỗi zip: chuỗi người dùng: tham khảo Câu hỏi sau đó trở thành, tốt nhất thực hành cho ứng dụng của bạn, hay đây là một giải pháp đơn giản cho một vấn đề phức tạp hơn?

Dung dịch:

Rails / PostgreSQL là một ngăn xếp công nghệ phổ biến được sử dụng trong phát triển và sản xuất. Có một phương pháp để lưu trữ địa chỉ ở dạng thích hợp của chúng bằng cách kích hoạt tiện ích mở rộng ‘hstore. Tiện ích mở rộng này cho phép chúng tôi lưu dữ liệu dưới dạng loại hstore cửa hàng (cửa hàng băm). Bước đầu tiên là kích hoạt mô-đun store hstore. Để làm điều này, chúng tôi sẽ viết một di chuyển:

Khi chúng tôi chạy ‘rails db: di chuyển trực tiếp từ dòng lệnh, Postgres sẽ kích hoạt tiện ích mở rộng‘ hstore. Điều này có thể được xác minh bằng cách kiểm tra tệp lược đồ.rb. Gần đầu tập tin bạn sẽ thấy:

 # Đây là các tiện ích mở rộng phải được bật để hỗ trợ cơ sở dữ liệu này
enable_extension trong đó plpgsql
enable_extension

Tiếp theo, chúng tôi sẽ tạo một di chuyển cho mô hình Người dùng:

Lưu ý cách chúng tôi sử dụng kiểu dữ liệu ‘hstore, cho trường địa chỉ. Điều này cho phép chúng tôi lưu trữ các cặp khóa / giá trị trong địa chỉ của Cameron.

Ngoài ra: Có thể sử dụng trường ‘hstore xông để lưu trữ bất kỳ cặp khóa / giá trị nào. Trong bài viết này, chúng tôi đang tìm hiểu về một Địa chỉ liên lạc trực tuyến, nhưng nó cũng hữu ích cho việc lưu trữ Tùy chọn ưu đãi hoặc bất kỳ loại dữ liệu băm nào khác.

Vì vậy, bây giờ chúng tôi có một trường duy nhất mà chúng tôi biết có thể lưu trữ dữ liệu ở dạng, Thành phố => Nhật Wonderland và Nhà nước => Tiêu PA. Chúng ta có thể tạo mô hình ‘Người dùng và Bộ điều khiển’ Người dùng nhưng làm thế nào để chúng ta thực sự lưu các cặp khóa / giá trị vào một trường cơ sở dữ liệu? Có một sự cân nhắc khác để thực hiện, làm thế nào chúng ta có thể duy trì cặp khóa / giá trị của Thành phố => Trò chơi Wonderlandland đến lĩnh vực địa chỉ trực tiếp?

Từ quan điểm của bộ điều khiển, trước tiên chúng ta phải đưa danh sách trắng bất kỳ tham số nào trước khi chúng có thể được gán khối lượng. Điều này được thực hiện trong phương thức riêng tư ‘user_params, giống như bất kỳ trường cơ sở dữ liệu nào khác.

Bằng cách liệt kê danh sách trắng những gì có thể được chỉ định theo địa chỉ, chúng tôi đã cung cấp các hướng dẫn cụ thể về dữ liệu mà chúng tôi đang mong đợi. Trường địa chỉ có thể có cặp thành phố / giá trị hoặc cặp trạng thái / giá trị, nhưng không phải là cặp khỉ / giá trị.

Trong biểu mẫu Người dùng của chúng tôi, chúng tôi cung cấp các trường thích hợp để thu thập dữ liệu:

Toàn bộ hình thức được hiển thị để trình diễn. Tuy nhiên, bắt đầu và kết thúc của trường địa chỉ được đánh dấu bằng các bình luận html. Lưu ý cách chúng tôi sử dụng trình trợ giúp biểu mẫu để tạo các trường cho địa chỉ. Mỗi trường tương ứng với một tham số được liệt kê trong danh sách trắng mà chúng tôi đã chỉ định trong bộ điều khiển. Mặc dù nó không phù hợp với bài viết này, nhưng biểu mẫu được tạo kiểu với các lớp từ thư viện Semantic-UI - điều đó có nghĩa là nó sẽ phản hồi nhanh và trông tuyệt vời!

Biểu mẫu trên được hiển thị trong trình duyệt

Chúng tôi có thể nhanh chóng tạo một người dùng và xem trường Địa chỉ của LinkedIn trông như thế nào:

Trường địa chỉ được lưu dưới dạng băm của các cặp khóa / giá trị, hoàn hảo!

Trong hình ảnh trên, thuật ngữ chủ đề của người dùng đồng nghĩa với người dùng, người dùng đồng nghĩa với người dùng. Như bạn có thể thấy, trường Địa chỉ mạng đã lưu các cặp khóa / giá trị của chúng ta khỏi bộ điều khiển giống như chúng ta mong đợi. Nếu chúng tôi muốn tìm giá trị của một người dùng cụ thể thành phố khác, chúng tôi có thể sử dụng, @ user.address ['city'] và điều này sẽ trả lại cho Wonder Wonderland trong trường hợp sử dụng ví dụ của chúng tôi.

Trong bài viết này, chúng tôi đã phát hiện ra phương pháp tối ưu để lưu và truy vấn các loại dữ liệu phức tạp trong PostgreSQL thông qua tiện ích mở rộng ‘hstore. Chúng tôi đã xác định rằng như một cách thực hành tốt nhất, những bước đầu tiên trong việc tạo một ứng dụng web là lập kế hoạch và thu thập thông tin. Chúng tôi cũng học được giá trị của việc tự khám phá thông tin bằng cách nghiên cứu và đọc tài liệu. Chỉ vì một nhà phát triển hoặc công ty khác làm điều gì đó một cách không có nghĩa là chúng ta nên làm theo một cách mù quáng. Nó rất quan trọng để đặt câu hỏi vì sao lại là người và sử dụng khả năng nhận thức của chúng ta để đưa ra kết luận một cách hợp lý. Tôi hy vọng bạn tìm thấy bài viết này hữu ích. Để biết thêm thông tin và hướng dẫn miễn phí về công nghệ web, hãy truy cập Learn2Code.