Tại sao sử dụng MySQL cho một trang web từ điển là một ý tưởng tồi?


55

Tôi dự định thiết kế và thiết lập một cơ sở dữ liệu để lưu trữ các mục từ điển (thường là các từ đơn) và ý nghĩa của chúng trong ngôn ngữ khác. Vì vậy, ví dụ, Bảng chú giải thuật ngữ phải có mục nhậpđịnh nghĩa và mỗi bản ghi bảng có một tham chiếu đến id của một bản ghi được lưu trong Tag(Mỗi mục phải có một thẻ hoặc danh mục).

Vì dữ liệu của tôi có cấu trúc, tôi nghĩ rằng sử dụng cơ sở dữ liệu SQL (như MySQL) không phải là ý tưởng tồi; nhưng mọi người nói MongoDB tốt hơn nhiều cho hiệu năng.

Ở phía máy khách, ứng dụng phải có khả năng cung cấp hộp tìm kiếm tự động hoàn thành, tiêu thụ API REST được cung cấp bởi phụ trợ. Có an toàn khi đi với MySQL trong một kịch bản như vậy? hoặc tôi nên sử dụng MongoDB hoặc ElasticSearch của bất kỳ giải pháp nào khác cho việc này? Hàng trăm ngàn hồ sơ được cho là được lưu trữ và truy cập theo cách này.


79
Những người nói với bạn những điều chưa thực hiện nhiều nghiên cứu về điều này. Ngôn ngữ có vốn từ vựng lớn nhất, tiếng Anh, có ít hơn một triệu từ riêng biệt. Điều này cũng nằm trong lĩnh vực khả năng thực hiện của DB quan hệ.
TheCatWhisperer

25
Tôi không thấy bất cứ điều gì ở đây sẽ khiến tôi nghĩ rằng MySQL sẽ không hoạt động tốt cho điều đó. Hiệu suất trên một tra cứu đơn giản sẽ không thành vấn đề và nó có tìm kiếm toàn văn nếu bạn cần đi theo lộ trình đó.
GrandmasterB

46
Liên quan đến "MongoDB tốt hơn nhiều cho hiệu suất". Đây là một tuyên bố chưa được sửa đổi mà không có phạm vi làm rõ, đây là thứ hạng vô nghĩa. Ví dụ: xem Công cụ dòng lệnh có thể nhanh hơn 235 lần so với Cụm Hadoop của bạn (mà tôi đã bắt gặp từ một liên kết trong Cuộc khủng hoảng béo phì của trang web ).
tự đại diện

82
Tôi quá mệt mỏi với việc mọi người nói rằng cơ sở dữ liệu quan hệ là xấu và MongoDB tốt hơn vì nó nhanh hơn. Điều đó giống như nói rằng ô tô là xấu và chúng ta nên sử dụng máy bay vì chúng đi nhanh hơn. Lời khuyên của tôi là bỏ qua lời khuyên như thế này.
Brandon

13
@Brandon Điều đáng buồn là toàn bộ tuyên bố "NoQuery nhanh hơn rất nhiều" thường làm sôi sục một số lời giải thích lý thuyết về lý do tại sao chúng phải tốt hơn nhiều, nhưng trong thực tế, thậm chí không áp dụng cho nhiều tình huống trong thế giới thực. Xem ví dụ ở đây . Bộ chuẩn được sử dụng của họ là mã nguồn mở và cũng có sẵn trên github. Hell Cern quản lý PB dữ liệu của họ với một OracleDB tốt.
Voo

Câu trả lời:


95

Tôi không thể nói cho bạn tại sao đó là một ý tưởng tồi. Tôi có thể cho bạn biết một loạt các lý do tại sao một cơ sở dữ liệu quan hệ là một ý tưởng tốt mặc dù.

  1. Hãy nhớ rằng không phải ai cũng xem xét một từ điển cho một định nghĩa. Nhiều lần hơn không, một từ điển được sử dụng để tìm đúng chính tả. Điều này có nghĩa là bạn không chỉ tìm kim trong đống cỏ khô , bạn đang tìm kiếm đống cỏ giống với kim được mô tả bởi người dùng (nếu tôi có thể sử dụng thành ngữ).

    Bạn sẽ không thực hiện tra cứu khóa chính. Bạn sẽ thực hiện tìm kiếm từ khóa

  2. Các từ có thể liên quan, theo nghĩa hoặc chính tả ( đọc, đọc , đỏsậy )

    Bất cứ khi nào bạn thấy từ "liên quan" hãy nghĩ "Cơ sở dữ liệu quan hệ"

  3. Nếu bạn cần tốc độ, bạn cần bộ nhớ đệm trên cơ sở dữ liệu quan hệ của bạn, chứ không phải mô hình dữ liệu quan hệ bị hỏng

  4. Một cơ sở dữ liệu được chuẩn hóa đúng sẽ tăng tốc độ tìm kiếm và tìm kiếm khóa chính vì đơn giản là có ít bit hơn để sàng lọc.

  5. Những người nói rằng cơ sở dữ liệu bình thường hóa chậm hơn đang đề cập đến 0,1% các trường hợp điều này là đúng. Trong 99,9% trường hợp khác, họ chưa thực sự làm việc với cơ sở dữ liệu thực sự được chuẩn hóa để xem hiệu năng, vì vậy hãy bỏ qua chúng. Tôi đã làm việc với một cơ sở dữ liệu chuẩn hóa. Yêu nó. Đừng muốn quay lại. Và tôi không phải là một anh chàng cơ sở dữ liệu. Tôi là một anh chàng C # / JavaScript / HTML / Ruby.

  6. Từ có nguồn gốc. Trong thực tế, nhiều từ trong cùng một ngôn ngữ có thể có cùng nguồn gốc, đó là một từ khác trong một ngôn ngữ khác. Chẳng hạn, sơ yếu lý lịch (thứ chúng tôi tải lên các trang web của nhà tuyển dụng để chúng tôi có thể nhận được các cuộc gọi điện thoại và e-mail liên tục trong 7 năm tới) là một từ tiếng Pháp.

  7. Một từ điển cũng định nghĩa loại từ đó là gì (danh từ, động từ, tính từ ect). Đây không chỉ là một đoạn văn bản: "danh từ" nó cũng có ý nghĩa. Ngoài ra với cơ sở dữ liệu quan hệ, bạn có thể nói những câu như "cung cấp cho tôi tất cả các danh từ cho tiếng Anh" và vì cơ sở dữ liệu được chuẩn hóa sẽ sử dụng các khóa ngoại và các khóa ngoại có (hoặc nên có) các chỉ mục, việc tra cứu sẽ rất nhanh chóng.

  8. Hãy nghĩ về cách các từ được phát âm. Đặc biệt trong tiếng Anh, rất nhiều từ có cùng cách phát âm (xem ví dụ của tôi ở trên với đọc và sậy, hoặc đọc và đỏ).

    Phát âm của một từ là, chính nó, một từ khác. Một cơ sở dữ liệu quan hệ sẽ cho phép bạn sử dụng khóa ngoại cho bất kỳ cách phát âm nào. Thông tin đó sẽ không được sao chép trong cơ sở dữ liệu quan hệ. Nó được nhân đôi như điên trong cơ sở dữ liệu không có SQL.

  9. Và bây giờ hãy nói về các phiên bản số nhiều và số ít của các từ. :) Hãy nghĩ "thuyền" và "thuyền". Hoặc thực tế là một từ là "số ít" hoặc "số nhiều".

  10. Oh! Và bây giờ chúng ta hãy nói về thì quá khứ, thì hiện tại, thì tương lai và hiện tại phân từ (thành thật mà nói, tôi không biết "phân từ hiện tại" tào lao là gì. Tôi nghĩ nó có liên quan đến những từ kết thúc bằng "ing" trong Tiếng Anh hoặc một cái gì đó).

    Tra cứu "chạy" và bạn sẽ thấy các thì khác: chạy, chạy, chạy

    Trong thực tế, "căng thẳng" là một mối quan hệ khác.

  11. Tiếng Anh không làm điều này quá nhiều, nhưng giới tính là một thứ khác định nghĩa một từ. Các ngôn ngữ như tiếng Tây Ban Nha có hậu tố xác định xem chủ ngữ của danh từ là nam hay nữ. Nếu bạn cần điền vào chỗ trống cho một câu, giới tính là cực kỳ quan trọng trong nhiều ngôn ngữ.

    Vì bạn không thể luôn dựa vào các quy ước ngôn ngữ để xác định giới tính (trong tiếng Tây Ban Nha, các từ kết thúc bằng "o" là nam / nam, nhưng điều đó không đúng với tất cả các từ), bạn cần một giá trị nhận dạng: Nam hoặc Nữ. Đây là một mối quan hệ khác mà một cơ sở dữ liệu chuẩn hóa xử lý một cách duyên dáng ngay cả ở hàng triệu bản ghi.

Với tất cả các quy tắc và mối quan hệ xoắn giữa các từ và thậm chí các ngôn ngữ khác nhau, tôi khó có thể tưởng tượng kho dữ liệu này là một "kho tài liệu" giống như một giải pháp không có SQL cung cấp. Có rất nhiều và rất nhiều mối quan hệ giữa các từ và các thành phần của chúng đến mức một cơ sở dữ liệu quan hệ là giải pháp hợp lý duy nhất.


7
Đối với # 1, lập chỉ mục thường là một trong những điểm mạnh của các dịch vụ không liên quan, không phải là điểm yếu.
JimmyJames

61
@JimmyJames Đừng nghĩ trong một phút rằng các hệ thống quan hệ không sử dụng cùng loại chỉ mục. Nhiều trong số các kỹ thuật đó đã đi tiên phong trong thế giới đó.
Blrfl

14
"Bất cứ khi nào bạn thấy từ" liên quan "hãy nghĩ" Cơ sở dữ liệu quan hệ "". Tôi không đồng ý. "Quan hệ" trong "cơ sở dữ liệu quan hệ" đề cập đến các bộ dữ liệu. Liên quan là một thuật ngữ quá rộng để tuyên bố này giữ bất kỳ nước nào
vườn

12
Ngoài ra còn có cơ sở dữ liệu đồ thị (Neo4j đến với tâm trí) được tập trung rõ ràng vào việc vượt qua các mối quan hệ thay vì thực hiện các phép nối truyền thống. Điều này có thể thuận lợi khi nhiều từ điển thực sự là mạng lưới các từ; ví dụ, dự án WordNet sử dụng định dạng giống như biểu đồ của riêng nó, thay vì RDMS truyền thống.
tucuxi

4
Tôi đã đánh giá thấp câu trả lời này chỉ cho "Bất cứ khi nào bạn thấy từ 'liên quan' hãy nghĩ 'Cơ sở dữ liệu quan hệ'." Điều đó thật nực cười . Tôi thích cơ sở dữ liệu quan hệ, nhưng mô hình quan hệ không phù hợp với tất cả các loại mối quan hệ. Quan điểm của bạn về dữ liệu chuẩn hóa cũng hoàn toàn sai. Bình thường hóa dữ liệu tối ưu hóa các chỉnh sửa , vì dữ liệu không bị trùng lặp, không phải tìm kiếm. (Đó là lý do tại sao các DB báo cáo không bình thường hóa. Họ sử dụng các kỹ thuật mô hình hóa chiều và các lược đồ sao.) Tôi không nghĩ bạn biết bạn đang nói gì. 80 upvote xác nhận tất cả các mối quan tâm của tôi về lời khuyên trên trang web này.
jpmc26

27

Nếu bạn đi với kho lưu trữ khóa-giá trị (cung cấp cho bạn một mô hình lập trình nghèo nàn hơn) và hóa ra bạn cần nhiều cấu trúc hơn (trong trường hợp của bạn, nói thêm ngôn ngữ thứ ba) hoặc bạn cần thực hiện các truy vấn phức tạp hơn liên quan đến việc tham gia , bạn sẽ dành rất nhiều thời gian để sắp xếp lại các khóa của mình, không chuẩn hóa dữ liệu của bạn và / hoặc lặp qua tất cả dữ liệu để tìm thấy những gì bạn cần.

Nếu bạn bắt đầu với cơ sở dữ liệu quan hệ, bạn có thể làm việc thông qua thiết kế, mã của ứng dụng và thử tập trung nhiều hơn vào mô hình dữ liệu tự nhiên cho ứng dụng của bạn, thay vì đưa nó vào biểu mẫu giá trị khóa.

Khi ứng dụng ổn định, bạn có thể làm việc với hiệu suất, bằng cách đo các tùy chọn khác nhau. Có khá nhiều thủ thuật hiệu năng cần thực hiện trong SQL trước khi cần chuyển đổi công nghệ. Bạn sẽ học được rất nhiều về ứng dụng của mình và sẽ ở vị trí tốt hơn nhiều để quyết định xem liệu mối quan hệ có làm tổn thương bạn hay không và liệu khóa-giá trị có hoạt động cho mô hình dữ liệu của bạn hay không.

Nếu hóa ra giá trị khóa chính xác là những gì ứng dụng của bạn cần, bạn có thể chuyển đổi mà không lãng phí đầu tư đáng kể vào mô hình quan hệ, trong khi cách khác xung quanh bạn có thể sẽ lãng phí thời gian khiến mô hình giá trị khóa thực hiện những việc đó tầm thường trong mô hình quan hệ.

Hãy xem xét cơ sở dữ liệu quan hệ như một công cụ tăng tốc để giúp ứng dụng của bạn được thiết kế, viết và chạy và chạy, trước các yêu cầu luôn thay đổi khi bạn tìm hiểu thêm về tên miền và người dùng của mình.

Khi bạn có hàng triệu người dùng, gần như chắc chắn bạn sẽ cần phải cấu trúc lại thiết kế, ngay cả khi bạn đã chọn khóa-giá trị để bắt đầu.


13
Phần kết trong bài viết này mô tả chính xác một kịch bản thay đổi yêu cầu làm mất hiệu lực thiết kế. Nó mô tả một ứng dụng (thực) là "trường hợp sử dụng hoàn hảo cho MongoDB", nhưng sau đó mô tả cách thay đổi tương đối nhỏ trong các yêu cầu, điều đó sẽ không quan trọng để thực hiện trong RDBMS, cần một lượng công việc kha khá và sẽ di chuyển nó đối với trường hợp sử dụng (như các phần trước của bài viết giải thích) rất không phải là trường hợp sử dụng tốt của Mongo.
Derek Elkins

5
Bài viết MongoDB của Sarah chính xác là những gì chúng tôi đã trải qua với một sản phẩm 1.0 mà chúng tôi đã xây dựng bằng cách sử dụng nó; bởi 1.1 chúng tôi đã sử dụng Postgres.
Joe

@DerekElkins, siêu tham khảo, thx!
Erik Eidt

1
"Nhưng sau đó mô tả cách thay đổi tương đối nhỏ trong các yêu cầu, điều đó sẽ không quan trọng để thực hiện trong RDBMS" Chắc chắn, nhưng điều ngược lại là đúng. Chúng tôi sử dụng RDBMS tại nơi làm việc và đối mặt với các vấn đề không đáng kể để giải quyết trong MongoDB. Thật kỳ lạ, các yêu cầu phần mềm không phải lúc nào cũng phù hợp hoàn hảo với khả năng của các công cụ chúng ta sử dụng.
NPSF3000

@ NPSF3000, thật tuyệt vời nếu bạn có thể trích dẫn một tài liệu tham khảo, như một blog hoặc một số văn bản được xây dựng trên đó!
Erik Eidt

10

Đối với một cơ sở dữ liệu nhỏ như vậy, có lẽ nó sẽ không tạo ra nhiều khác biệt cho hiệu suất. Một RDBMS tiêu chuẩn không phải là một ý tưởng tồi tệ ở đây bởi vì có lẽ, nên có nhiều lượt đọc hơn là viết một mục nhất định. Hiệu suất dường như không phải là một trình điều khiển chính cho điều này. Bộ nhớ đệm trong lớp ứng dụng cũng giảm thiểu những lo ngại như vậy.

Sự xem xét khác là nhân rộng và khả năng phục hồi. Cơ sở dữ liệu quan hệ có xu hướng được thiết kế xung quanh một trường hợp duy nhất. Bạn nên đọc định lý CAP và xem xét điều gì quan trọng nhất với bạn.


Làm thế nào để áp dụng CAP cho một ứng dụng web tương đối bình thường? Tùy thuộc vào bộ của bạn, có khả năng bạn có thể duy trì hàng ngàn kết nối gửi đến và một lớp bộ nhớ đệm trang có thể tăng số lượng đó bằng một thứ tự lớn. CAP chỉ bắt đầu trở thành thứ bạn cần xem xét khi hệ thống phân tán là cách duy nhất để đạt được mục tiêu của bạn.
Ben

2
@Ben Khả năng phục hồi là một mục tiêu theo đúng nghĩa của nó. Nếu có một điểm thất bại duy nhất không được chấp nhận cho một ứng dụng, các giải pháp phân tán đưa ra giải pháp. Các giải pháp không phải RDBMS có xu hướng được định hướng nhiều hơn về vấn đề này. Nó không chỉ đơn giản là khối lượng để xem xét. Độ trễ và tính sẵn sàng là mối quan tâm. Nếu yêu cầu của bạn là có 99,9% thời gian hoạt động. Bạn chỉ có thể ngừng hoạt động khoảng 9 giờ một năm và mất dữ liệu trong một db là thảm khốc, do đó bạn cần tính đến sao chép / sao lưu / ảnh chụp nhanh. Thật sai lầm khi nghĩ rằng nó nhất thiết đơn giản hóa mọi thứ.
JimmyJames

2

Các cơ sở dữ liệu NoQuery này luôn có vẻ như là một ý tưởng tốt ngay từ đầu, nhưng bạn sẽ được đảm bảo gặp sự cố khi bạn bắt đầu xử lý các trường hợp cạnh (ví dụ: từ khóa phải tìm kiếm theo giá trị của chúng (hoặc một phần) chẳng hạn.

Nó sẽ là một lựa chọn an toàn hơn để đi với một cơ sở dữ liệu quan hệ ngay từ đầu và sau đó không chuẩn hóa sau đó. MySQL là tuyệt vời cho mục đích này (cơ sở dữ liệu quan hệ đơn giản với tìm kiếm dựa trên văn bản), không có quá nhiều trường hợp sử dụng mà bạn sẽ thấy nó phải vật lộn với loại dữ liệu này. Chỉ cần đảm bảo rằng các chỉ mục của bạn được thiết lập chính xác và bạn sẽ thấy nó sẽ hoạt động ở mức tương đương (hoặc tốt hơn khi thực hiện tìm kiếm văn bản) với cơ sở dữ liệu NoQuery và nó sẽ cho phép bạn linh hoạt sửa đổi logic ứng dụng của mình mà không cần ràng buộc với một cấu trúc dữ liệu cụ thể.

Khi bạn tìm thấy cách sử dụng phổ biến nhất cho dữ liệu của mình (và nếu bạn thấy nó không đáp ứng nhu cầu hiệu suất của mình), thì bạn có thể tiến hành khử chuẩn hóa dữ liệu bằng cách xuất ra một định dạng có thể được tải vào (và lấy ra từ) một lược đồ NoQuery.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.