2009-02-19 29 views
8

Ưu và nhược điểm của việc sử dụng khóa chính của cơ sở dữ liệu của bạn làm số nhận dạng URL là gì? Ví dụ: http://localhost/post/view/13 - 13 là khóa chính của tôi cho bảng bài đăng của tôi.Sử dụng Khóa chính/Trường ID làm số nhận dạng trong URL

Một số trang web như sử dụng reddit gì tôi giả sử là một id duy nhất đó không phải là khóa chính nhưng vẫn độc đáo để giúp xác định liên kết:

http://www.reddit.com/r/funny/comments/7ynin/the_mystery_of_irelands_worst_driver/

Bạn có thể thay đổi phần cuối của URL để bất cứ điều gì bạn muốn miễn là/7ynin/là như nhau.


Digg dường như sử dụng một sên của tiêu đề liên kết đến các id một liên kết:

http://digg.com/space/Liquid_Water_Recently_Seen_on_Mars

Trong khi nếu tôi nhớ chính xác một mặc định WordPress cài đặt sử dụng p index.php = # là? id của họ cho đến khi url lạ mắt được bật.


tôi có thể thấy lý do tại sao vì lợi ích của SEO của bạn sẽ muốn có url nhiều thông tin nhất có thể nhưng tôi chỉ cố gắng để xem nếu sử dụng khóa chính là một nguy cơ bảo mật hoặc hình thức đơn giản chỉ là xấu.

+0

tra cứu, nhìn lên. bạn thấy gì? một khóa chính. cộng với một con sên thân thiện với SEO. sử dụng tên thân thiện nếu bạn có, nếu không thì PK là tốt. NHƯNG ĐẢM BẢO R THENG NGƯỜI DÙNG KHÔNG THỂ XEM NHỮNG THÔNG TIN NGƯỜI DÙNG KHÁC. –

Trả lời

12

Bạn luôn muốn trình bày cho người dùng một URL đẹp - không phải một số ID được tạo tự động khó chịu. Nhưng tôi không nghĩ bạn nên nói "url thân thiện" là khóa chính. Bạn vẫn nên sử dụng PK tự động, số "cổ điển" và có cột thứ hai là "url thân thiện" duy nhất. Tại sao?

  1. Tất cả các bảng nhận xét, xếp hạng bảng, bất kể các bảng có mối quan hệ với bảng nội dung của bạn có thể sử dụng khóa chính số. Điều này có nghĩa là các chỉ mục nhỏ hơn và sử dụng bộ nhớ thấp hơn.
  2. Ai đó sẽ muốn thay đổi url thân thiện. Nếu bạn đã có khóa chính bằng số, bạn không cần phải cập nhật bất kỳ bảng phụ thuộc nào của bạn (hoặc yêu cầu DB thực hiện thông qua bản cập nhật xếp tầng ).
  3. Trong tương lai, bạn có thể tóm tắt các bit URL vào một bảng khác. Bảng được cho biết có thể sau đó lưu trữ ánh xạ URL "cũ" vấn đề đó chuyển hướng đến bản đồ URL chính "thực sự" . Sau đó, khi người dùng muốn thay đổi URL thân thiện, bạn không phải phá vỡ tất cả các URL di sản trong nước . Không thể làm điều này nếu khóa chính của bạn là "URL thân thiện".
  4. Tôi vẫn muốn sử dụng khóa chính số trong tất cả AJAX goo của tôi (ví dụ: hàm javascript post_new_comment() sẽ lấy khóa chính chứ không phải một số URL thân thiện). Thời gian duy nhất tôi sử dụng URL thân thiện là trong bất kỳ cấu trúc URL nào hướng đến người dùng.
  5. Vì lý do bảo mật? Nếu nội dung của bạn được kiểm soát truy cập, bạn sẽ phải kiểm tra quyền truy cập cho dù đó là khóa chính hay một số URL thân thiện.
  6. Nếu bạn cho phép các cách truy cập nội dung thông qua khóa chính, mọi người có thể thử cắm ID ngẫu nhiên. Nếu yêu cầu của bạn không chỉ giới hạn quyền truy cập vào nội dung, mà nội dung bị từ chối đã tồn tại, đó là vấn đề về các lỗi của bạn. Nó cũng giống như với thất bại đăng nhập - bạn không nói "tên người dùng không tìm thấy" bạn nói "tên người dùng hoặc mật khẩu xấu". Việc cắm các giá trị ngẫu nhiên để tìm nội dung sẽ là một vấn đề đối với bất kỳ phương pháp nào bạn thực hiện, chỉ với các phím số có ít giá trị hơn để thử.

Bottom line: Friendly URL's? Đúng rồi. Sử dụng chúng làm khóa chính? Trơi ơi không.

1

Con: bất kỳ khách truy cập nào đều có thể dễ dàng thử và đoán các ID khác, có thể không phải là những gì bạn muốn.

+0

Đối với hầu hết các phần, tôi không thực sự nhìn thấy những gì là sai trong việc truy cập những thứ trên một trang web bằng cách sử dụng ID khác nhau trong URL. Nếu bạn đang nói về những thứ như trang người dùng cá nhân và những thứ cần hạn chế, bạn đã có các phương pháp xác thực khác để ngăn chặn truy cập. – TheTXI

2

Nó vốn không phải là một nguy cơ bảo mật, mặc dù nó không nói với các thực thể bên ngoài những điều về hệ thống của bạn, mà nói chung là thực hành tốt để tránh.

+0

Tôi hy sinh? Tôi hình dung nếu tôi sử dụng các từ khóa có liên quan, tôi sẽ quảng bá SEO. Có lẽ tôi chỉ đọc sai. –

+0

Trong chỉnh sửa đó (mà tôi đã bỏ đi vì tôi không đọc đoạn cuối của câu hỏi của bạn khi tôi viết nó), tôi có nghĩa là bạn hy sinh giá trị SEO nếu bạn sử dụng các khóa chính thay vì sên. (Bạn cũng hy sinh giá trị SEO nếu bạn sử dụng chúng ngoài sên, nhưng không nhiều.) – chaos

2

Như bạn đã nói, điểm đặt tiêu đề trực tiếp vào URL là SEO. Việc có từ khóa trong URL có ảnh hưởng đáng kể đến kết quả của công cụ tìm kiếm.

Tuy nhiên, một vài suy nghĩ khác liên quan đến ví dụ của bạn:

  • Tôi không chắc chắn lý do tại sao bạn cho rằng chìa khóa reddit chữ và số không phải là chính, không có gì buộc khóa chính phải là số của. Nếu đó là mã định danh duy nhất cho bài đăng, không có lý do gì để không sử dụng nó làm khóa chính (hoặc ít nhất là một phần của nó).
  • Digg thực sự thực thi tính độc đáo của các chức danh (có lẽ chỉ trong một danh mục cụ thể, tôi đã không đến Digg trong nhiều năm, vì vậy tôi không thể nhớ lại). Tôi đã từng thấy điều này khá thường xuyên với một câu chuyện trùng lặp có một URL như:

    http://digg.com/space/Liquid_Water_Recently_Seen_on_Mars_2 
    

    này ngụ ý rằng tiêu đề là ít nhất một phần của khóa chính, vì đó là cách duy nhất để xác định câu chuyện liên kết được ý định để nhắm vào.

Không có bất kỳ rủi ro bảo mật đáng kể nào khi sử dụng khóa chính trong URL, ngoài khả năng mọi người đoán/dự đoán các khóa khác, như pantulis đã đề cập. Nhưng bạn không nên dựa vào "không ai sẽ đoán điều này" như một biện pháp an ninh anyway.

+0

Điểm rất tốt. Tôi cho rằng ý tưởng của tôi về những gì tạo thành một khóa chính là một chút sai lầm. Tôi thích sự sạch sẽ của các url của digg nhưng khả năng cho phép sên trùng lặp trong các url của reddit. Tôi nghĩ tôi sẽ cố gắng sử dụng sự kết hợp của cả hai. Cảm ơn! –

2

Nếu bạn không bao gồm khóa chính trong URL/liên kết, thì bạn phải tạo một loại khóa tổng hợp tạm thời, VÀ, sau đó, bạn phải lưu ánh xạ của khóa đó vào phiên cho người dùng. Điều này cho biết thêm sử dụng nhà nước/bộ nhớ/cái gì đó để phá vỡ ứng dụng của bạn.

Nếu giá trị thực sự nhạy cảm, thì có thể đáng giá tiền để ẩn nó. Tuy nhiên, che khuất chìa khóa không thực sự làm cho nó an toàn, phải không? Bạn cần phải kiểm tra vai trò người dùng trong bất kỳ "điều khiển" (servlet, code-behind, bất cứ điều gì) trước khi cấp quyền truy cập vào mục.

0

Reddit cũng sử dụng ID số nhưng được chuyển đổi bằng cách sử dụng Base 36, do đó, nó xuất hiện dưới dạng chuỗi. Nó giống như số hexadecmial, mà trên thực tế là một chuỗi là tốt. Sự khác biệt duy nhất là cơ sở.

Cơ sở 36 là "hệ thống chữ số và chữ số nhỏ gọn không phân biệt chữ hoa chữ thường nhỏ nhất sử dụng ký tự ASCII" và dễ dàng mã hóa và giải mã được. Tại sao 36? A-Z = 26 + 0-9 = 10.

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