2008-11-10 17 views
8

tôi chạy (và hiện đang đại tu hoàn toàn) một trang web liên quan đến nhà hát (njtheater.com nếu bạn quan tâm).Cách tốt nhất để lưu trữ tiêu đề trong cơ sở dữ liệu để cho phép sắp xếp mà không có phần "The", "A"

Khi tôi truy vấn danh sách phát từ cơ sở dữ liệu, tôi muốn "Người bán của Venice" sắp xếp theo "M". Tất nhiên, khi tôi hiển thị tên của vở kịch, tôi cần chữ "The" ở phía trước.

Cách tốt nhất để thiết kế cơ sở dữ liệu để xử lý điều này là gì?

(Tôi đang sử dụng MS-SQL 2000)

Trả lời

17

Bạn đang đi đúng hướng với hai cột, nhưng tôi khuyên bạn nên lưu trữ toàn bộ tiêu đề có thể hiển thị trong một cột, thay vì nối các cột. Cột khác được sử dụng hoàn toàn để phân loại. Điều này mang lại cho bạn sự linh hoạt hoàn toàn về sắp xếp và hiển thị, thay vì bị mắc kẹt với một tiền tố đơn giản.

Đây là một cách tiếp cận khá phổ biến khi tìm kiếm (có liên quan đến sắp xếp). Một cột (có chỉ mục) được phân tách chữ hoa chữ thường, dấu chấm câu, v.v. Trong trường hợp của bạn, bạn cũng sẽ áp dụng quy ước ngữ pháp của việc loại bỏ các bài viết dẫn đầu về các giá trị trong trường này. Cột này sau đó được sử dụng làm khóa so sánh để tìm kiếm hoặc sắp xếp. Cột khác không được lập chỉ mục và giữ nguyên khóa ban đầu để hiển thị.

+0

Giải pháp tuyệt vời và chỉ cần thanh lịch như bạn có thể muốn. Nó có thể yêu cầu một số người dùng nhập vào phía trước (vì có lẽ không phải là một giải pháp 100% để sắp xếp thứ tự sắp xếp thành tiêu đề mà không có sự trợ giúp của con người), nhưng có vẻ tốt nhất từ ​​quan điểm dữ liệu. –

1

Store tiêu đề trong hai lĩnh vực: TITLE-PREFIX và TITLE-TEXT (hoặc một số như vậy). Sau đó, sắp xếp vào thứ hai, nhưng hiển thị nối của hai, với một không gian giữa.

+0

Điều đó sẽ có một khoảng trống trước tất cả các đầu sách không bắt đầu bằng tiền tố. –

+0

Đúng. Vì vậy, sử dụng ISNULL (TITLE-PREFIX + '', '') + TITLE-TEXT (Tôi nghĩ NULL + '' là NULL ...) – dkretz

+0

Tôi nghĩ đây là câu trả lời tối ưu. –

1

Giải pháp riêng của tôi cho vấn đề là tạo ba cột trong cơ sở dữ liệu.

article varchar(4) 
sorttitle varchar(255) 
title  computed (article + sortitle) 

"bài viết" sẽ chỉ được một trong hai "The", "A" "An" (lưu ý dấu không gian trên mỗi) hoặc chuỗi rỗng (không null)

"sorttitle" sẽ là tiêu đề với bài viết hàng đầu đã bị xóa.

Bằng cách này, tôi có thể sắp xếp trên SORTTITLE và hiển thị TITLE. Có rất ít xử lý thực tế đang diễn ra trên trường được tính toán (vì vậy nó nhanh) và chỉ có một công việc nhỏ cần thực hiện khi chèn.

0

Tôi đồng ý với doofledorfer, nhưng tôi khuyên bạn nên lưu trữ không gian được nhập như một phần của tiền tố thay vì giả sử đó là một không gian duy nhất. Nó cho phép người dùng của bạn linh hoạt hơn. Bạn cũng có thể thực hiện một số kết nối trong truy vấn của mình, do đó bạn không phải hợp nhất các trường như một phần của logic nghiệp vụ của mình.

0

Tôi không biết điều này có thể được thực hiện trong SQL Server hay không. Nếu bạn có thể tạo các chỉ mục dựa trên hàm, bạn có thể tạo một chỉ mục thực hiện một regex trên trường hoặc sử dụng hàm của riêng bạn. Điều này sẽ mất ít không gian hơn một trường bổ sung, sẽ được cập nhật bởi chính cơ sở dữ liệu và cho phép tiêu đề hoàn chỉnh được lưu trữ cùng nhau.

Các vấn đề liên quan