2011-01-04 39 views
6

Xem xét một ứng dụng thương mại điện tử với nhiều cửa hàng. Mỗi chủ cửa hàng có thể chỉnh sửa danh mục mặt hàng của cửa hàng của mình.Cách tốt nhất để lưu trữ tên mục do người dùng gửi (và từ đồng nghĩa của họ)

schema cơ sở dữ liệu hiện tại của tôi là như sau:

item_names: id | name | description | picture | common(BOOL) 
items: id | item_name_id | picture | price | description | picture 
item_synonyms: id | item_name_id | name | error(BOOL) 

Ghi chú: error chỉ ra một sai chính tả (ví dụ: "Ericson".). descriptionpicture của bảng item_names"globals" rằng tùy chọn có thể được ghi đè bởi "địa phương"descriptionpicture lĩnh vực của items bảng (trong trường hợp chủ sở hữu cửa hàng này muốn cung cấp một bức tranh khác nhau cho một mục). common giúp tên item độc đáo riêng biệt ("Jimmy Joe Pizza Cheese" từ "Cheese Pizza")

Tôi nghĩ mặt tươi sáng của giản đồ này là:

Tối ưu hóa tìm kiếm & Xử lý đồng nghĩa: tôi có thể truy vấn các item_names & item_synonyms bảng sử dụng name LIKE %QUERY% và lấy danh sách item_name_id s cần được kết hợp với bảng items. (Ví dụ về từ đồng nghĩa: "Sony Ericsson", "Sony Ericson", "X10", "X 10")

Tự động hoàn thành: Một lần nữa, truy vấn đơn giản tới bảng item_names. Tôi có thể tránh việc sử dụng DISTINCT và nó giảm thiểu số lượng biến thể ("Sony Ericsson Xperia ™ X10", "Sony Ericsson - Xperia X10", "Xperia X10, Sony Ericsson")

Phía xuống sẽ là:

Chi phí: Khi chèn một mục, tôi truy vấn item_names để xem liệu tên này đã tồn tại chưa. Nếu không, tôi tạo một mục mới. Khi xóa một mục, tôi đếm số mục nhập có cùng tên. Nếu đây là mục duy nhất có tên đó, tôi xóa mục nhập khỏi bảng item_names (chỉ để giữ mọi thứ sạch sẽ; tài khoản có thể gửi sai). Và cập nhật là sự kết hợp của cả hai.

Tên mục lạ: Chủ sở hữu cửa hàng đôi khi sử dụng các câu như "Harry Potter 1, 2 Sách + CD + Magic Hat". Có điều gì đó về việc có quá nhiều chi phí để chứa đựng những trường hợp như thế này. Đây có lẽ sẽ là lý do Thủ Tôi bị cám dỗ để đi cho một giản đồ như thế này:

items: id | name | picture | price | description | picture 

(... với item_namesitem_synonyms như bảng tiện ích mà tôi có thể truy vấn)

  • Có một lược đồ tốt hơn bạn sẽ đề xuất?
  • Tên mục có nên được chuẩn hóa để tự động hoàn tất không? Đây có lẽ là những gì Facebook thực hiện cho mục "School", "City" không?
  • Lược đồ đầu tiên hay thứ hai tốt hơn/tối ưu cho tìm kiếm?

Xin cảm ơn trước!

Tài liệu tham khảo: (1) Is normalizing a person's name going too far?, (2) Avoiding DISTINCT


EDIT: Trong trường hợp có 2 mặt hàng được nhập với tên tương tự, một quản lý người xem đây chỉ đơn giản là nhấp chuột "Make Synonym" mà sẽ chuyển đổi một trong các tên thành từ đồng nghĩa của tên khác. Tôi không yêu cầu cách tự động phát hiện nếu tên đã nhập là từ đồng nghĩa của tên khác. Tôi hy vọng tự động hoàn thành sẽ chăm sóc 95% các trường hợp như vậy. Khi bộ bảng tăng kích thước, nhu cầu "Tạo Từ đồng nghĩa" sẽ giảm. Hy vọng rằng xóa sự nhầm lẫn.


UPDATE: Đối với những ai muốn biết những gì tôi đã đi trước với ... Tôi đã đi với giản đồ thứ hai nhưng loại bỏ các bảng item_namesitem_synonyms với hy vọng rằng Solr sẽ cung cấp cho tôi với khả năng thực hiện tất cả các tác vụ còn lại tôi cần:

items: id | name | picture | price | description | picture 

Cảm ơn mọi người đã trợ giúp!

+0

Đã bắt đầu một phần thưởng. Hy vọng sẽ có nhiều câu trả lời hơn từ tất cả các bạn, DB Gurus. – RabidFire

+1

Tôi nghĩ rằng vấn đề là chúng tôi không rõ ràng về YÊU CẦU CỦA BẠN. Tôi sẽ gợi ý những gì tôi nghĩ đang xảy ra. Bạn tương đương với Amazon. Nhiều người bán có thể cung cấp {Nike Air Jordon Red/White 10.5US}. Nhưng tất cả họ có thể gọi chúng bằng tên khác nhau, do đó bạn có một vấn đề bình thường hóa. Đây không phải là các mặt hàng có SKU có PK phổ thông. Vì vậy, bạn đang cố gắng để lấy được rằng hai điều thực sự là điều tương tự bằng cách so sánh các nhân vật trong tên? Và bạn nghĩ rằng đây là một vấn đề của lược đồ đúng? Tôi không hiểu. –

+0

Yêu cầu của tôi sẽ là "Tối ưu hóa tìm kiếm", "Xử lý Từ đồng nghĩa" và "Tự động điền". Người dùng cố gắng nhập một mục từ một Trường Văn bản. Tự động hoàn thành cố gắng ngăn chặn quá nhiều biến thể của cùng một tên mục. Vâng, đó là một vấn đề thiết kế. Tôi đang tìm một quan điểm tốt hơn về việc chọn lược đồ thứ hai trên lược đồ đầu tiên. – RabidFire

Trả lời

2

Các yêu cầu bạn nêu trong nhận xét của mình ("Tìm kiếm được tối ưu hóa", "Xử lý Từ đồng nghĩa" và "Tự động hoàn tất") không phải là những thứ thường được liên kết với RDBMS. Có vẻ như những gì bạn đang cố giải quyết là một vấn đề tìm kiếm, không phải là vấn đề lưu trữ dữ liệu và bình thường hóa.Bạn có thể muốn bắt đầu xem xét một số kiến ​​trúc tìm kiếm như Solr

Trích từ danh sách tính năng Solr:

mặt tìm kiếm dựa trên giá trị duy nhất lĩnh vực, truy vấn rõ ràng, hoặc phạm vi ngày

gợi ý chính tả cho truy vấn của người dùng

Giống như đề xuất này cho tài liệu đã cho

Chức năng đề xuất tự động

Tối ưu hóa hiệu suất

+0

Đẹp! Tôi đã xem xét Solr và các tính năng của nó. Nó có vẻ cực kỳ mạnh mẽ (đặc biệt là phân tích văn bản của nó) và mô tả chính xác những gì tôi đang tìm kiếm. Cảm ơn. Tiền thưởng được trao. – RabidFire

0

Chỉ là một ý tưởng.

Một điều tôi nghĩ đến là phân loại các ký tự trong tên và từ đồng nghĩa sẽ loại bỏ tất cả các khoảng trắng. Điều này tương tự như giải pháp tìm kiếm tất cả các đảo chữ cái cho một từ. Kết quả cuối cùng là khả năng tìm nhanh các mục tương tự. Như bạn đã chỉ ra, tất cả các từ đồng nghĩa nên hội tụ thành một cụm từ hoặc tên. Việc tìm kiếm được thực hiện đối với các từ đồng nghĩa bằng cách sử dụng chuỗi đầu vào được sắp xếp lại.

+0

Đó là một cách tốt để lưu trữ đảo chữ cái, trong đó các từ được * đồng nghĩa * với nhau nếu các ký tự được sắp xếp với khoảng trắng bị xóa là giống nhau. Nhưng tôi không nghĩ rằng tôi muốn trở lại "ngọn" khi người dùng tìm kiếm "chậu". :) – RabidFire

1

Nếu có nhiều thuộc tính được hiển thị để lập bản đồ, tôi khuyên bạn nên sử dụng hệ thống chỉ mục tìm kiếm nhanh. Không cần phải thiết lập bí danh như các bản ghi được thêm vào, các thuộc tính chỉ đơn giản là có được lập chỉ mục và mỗi tìm kiếm phát hành trả về phù hợp với một điểm liên quan. Lấy X% hàng đầu làm đối sánh hợp lệ và hiển thị chúng.

Tạo và lưu trữ bí danh có vẻ như một cách tiếp cận tập trung lao động, có thể sẽ không thể điều chỉnh theo nhu cầu của người dùng của bạn.

+0

Tôi giả sử bạn đang yêu cầu tôi xóa các từ đồng nghĩa lưu trữ (bí danh)? Làm cách nào để trả lại kết quả tìm kiếm cho "sữa chua", "sữa chua" hoặc "yogourt"? http://en.wikipedia.org/wiki/Yoghurt Tôi giả định rằng nó sẽ được thâm dụng lao động ngay từ đầu. Nhưng khi số lượng mục tăng lên, mọi người chủ yếu sẽ thêm các mục hiện có trước đây nhờ vào Tự động điền. Tôi nghĩ rằng Facebook autocomplete cho College Name là một ví dụ tốt đẹp về điều này. – RabidFire

+0

Có các hệ thống lập chỉ mục ở đó sử dụng logic mờ để tìm các kết quả phù hợp. Nghe có vẻ giống hoặc tương tự, các loại tìm kiếm chẳng hạn. Không có nhiều câu trả lời, tôi đồng ý, vì nó không cung cấp một công nghệ cụ thể - tôi chỉ hy vọng chỉ đạo bạn theo một hướng khác và cung cấp cho bạn nhiều lựa chọn hơn. – ScottCher

+0

Cảm ơn sự giúp đỡ. Upvoted vì nó đã cho tôi suy nghĩ về lược đồ thứ hai nhiều hơn một chút. Tôi nghĩ rằng tôi sẽ để lại tất cả các nâng nặng để Solr mặc dù (dựa trên câu trả lời của một poster). – RabidFire

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