Nhóm của tôi rất sợ các thực thể cơ sở dữ liệu quan hệ có mối quan hệ khóa ngoài và tôi không hiểu tại sao


12

Tôi mới ra trường đại học nên hầu hết sự quen thuộc với cơ sở dữ liệu quan hệ là từ khóa học cơ sở dữ liệu của tôi, nơi mọi thứ không có trong BCNF hoặc 3NF đều là một trò hề. Chắc chắn đó là một kết thúc cực kỳ, nhưng nhóm của tôi tại nơi làm việc thực sự dường như đưa nó đến kết thúc hoàn toàn ngược lại.

Trong các lược đồ db microservice của chúng tôi, các thực thể hiếm khi có nhiều hơn một bảng. Bất cứ điều gì bạn thường bình thường hóa vào một bảng khác sẽ được lưu trữ trong một cột json. Nếu sau đó phát hiện ra rằng một trong các thuộc tính trong json này cần được truy vấn, một cột mới sẽ được thêm vào và dữ liệu được lưu trữ ở cả hai vị trí (có, trong hai cột khác nhau trong cùng một bảng).

Trong rất nhiều trường hợp các cột json này chắc chắn có lợi thế. Nếu bạn không bao giờ cần truy vấn dữ liệu đó và nếu bạn không bao giờ phải thực hiện thay đổi đơn phương đối với dữ liệu đó (đó là điều bạn rõ ràng không thể dự đoán được), đó không phải là một ý tưởng tồi. Ngoài ra, nhiều dịch vụ của chúng tôi không thấy máy chủ hoặc được lưu trữ trên các máy có dung lượng ổ đĩa tối nghĩa cho những gì chúng cần, vì vậy sao chép dữ liệu không phải là vấn đề lớn. (Mặc dù một cái gì đó tôi thường muốn tránh ra khỏi triết lý)

Hiện tại chúng tôi đang xây dựng một dịch vụ khớp với các quy tắc dựa trên một tập hợp các điều kiện mà họ sở hữu và sau đó thực hiện một bộ hành động được liên kết với các quy tắc đó khi các quy tắc là đúng (ví dụ: tất cả các điều kiện là đúng). Nhóm phụ của tôi ngay lập tức xây dựng dịch vụ này tin rằng có một lợi ích đáng kể để bình thường hóa các hành động và điều kiện khỏi các quy tắc trong lược đồ. Rõ ràng các bảng này duy trì các mối quan hệ khóa ngoài với id quy tắc. Từ quan điểm của chúng tôi, chúng tôi có thể tránh trùng lặp dữ liệu theo các điều kiện cho phép chúng tôi đảm bảo rằng chúng chỉ được đánh giá một lần một lần và dễ dàng tìm thấy các điều kiện và quy tắc chúng tôi cần khi cần chúng mà không cần phải rút ra từng quy tắc và thực hiện tìm kiếm trong bộ nhớ.

Nói chuyện với một trong những kỹ sư chính của chúng tôi hôm nay, anh ấy đã cố gắng đẩy tôi ra xa khỏi lược đồ này. Cố gắng tranh luận theo mọi cách mà chúng ta không thực sự cần nó sẽ gây ra các vấn đề về hiệu suất trong tương lai, tham khảo một nguyên khối cũ mà chúng ta sở hữu đó là một trò hề thiết kế. Ông gọi những gì chúng ta đang làm là "cách cũ" và những chiếc bàn phẳng với json là "cách mới". Ông lập luận rằng ở những nơi tôi muốn nguyên tử, chúng ta không cần nó và thay vì truy vấn, chúng ta nên làm nhiều thứ hơn trong bộ nhớ. Đây là một nguyên tắc thiết kế mà nhiều dịch vụ của chúng tôi tuân theo. Chúng tôi không dự đoán rằng khối lượng dữ liệu của chúng tôi sẽ tăng lên đáng kể, điều này sẽ giúp truy vấn của chúng tôi nhanh chóng. Những gì chúng tôi dự đoán là rất nhiều thời gian dành cho việc đánh giá quy tắc và thực hiện các hành động.

Tôi hiểu rằng các cơ sở dữ liệu phi quan hệ đã trở nên phổ biến hơn trong những năm gần đây nhưng ngay cả khi tích cực tìm kiếm thông tin về ý nghĩa hiệu suất của các mối quan hệ khóa ngoài, tôi không thấy nhiều thông tin đưa ra trường hợp của mình. Tôi cho rằng họ có thể có xu hướng giới thiệu các giao dịch lớn có thể gây ra sự cố, nhưng đó dường như là một vấn đề độc lập với chính khóa ngoại.

Đây có phải là sự ngây thơ của tôi? Hay đây thực sự là thứ mà tôi và đội phụ của tôi đang thiếu? Tôi rõ ràng không cung cấp thông tin chi tiết về vấn đề của chúng tôi vì tôi không nhất thiết phải tìm giải pháp cho vấn đề đó. Cho rằng đó là một xu hướng phổ biến trong đội ngũ lớn hơn của chúng tôi, tôi thực sự tò mò nếu họ tiếp tục làm điều gì đó với điều này.


Câu trả lời cho câu hỏi của bạn trong tiêu đề sẽ là "Họ sợ hãi vì sự nguyên khối cũ trong công ty của bạn". Nhưng phần chính câu hỏi của bạn dường như hỏi một cái gì đó hoàn toàn khác, tức là "Các khóa ngoại có giới thiệu các vấn đề về hiệu suất không?"
Christian Hackl

2
Tôi tự hỏi bao nhiêu% RDBMS mà họ đã xây dựng trong mã "ứng dụng"
Caleth

Cách tiếp cận có tốt hay không phụ thuộc vào loại ứng dụng bạn đang xây dựng, nhu cầu của nó và hướng đi của nó (yêu cầu, ràng buộc về kiến ​​trúc) - điều mà chúng tôi không thể thực sự đánh giá ở đây. Đối với NoQuery - toàn bộ là về việc hỗ trợ khả năng mở rộng theo chiều ngang và về sự thừa nhận rằng không phải tất cả các ứng dụng đều yêu cầu các ràng buộc nghiêm ngặt của RDBMS. Để tìm hiểu thêm, hãy sử dụng 3 câu trả lời hàng đầu ở đây làm điểm bắt đầu (thứ 2 và thứ 3 đi sâu hơn).
Filip Milovanović

2
Nếu tôi có thể cung cấp một số lời khuyên phi kỹ thuật: giảm âm thanh xuống một chút. Bạn đang trải qua rất nhiều phán xét ("vâng, trong hai cột khác nhau trong cùng một bảng", "thiết kế di chuyển") trong công việc mà bạn không liên quan đến các quyết định thiết kế và thực hiện nó từ vị trí kinh nghiệm thực tế tối thiểu . Tôi không thể nói bạn đúng hay sai vì tôi chưa xem dự án, nhưng các hệ thống có xu hướng là một loạt các thỏa hiệp dẫn đến sản phẩm hoàn chỉnh có chức năng nhưng kém tinh khiết về mặt khái niệm. Điều này sẽ trở nên rõ ràng hơn khi sự nghiệp của bạn tiến triển và làm cho những quyết định đó trở thành một phần công việc của bạn.
Blrfl

@Blrfl Tuyệt vời đặt
Robbie Dee

Câu trả lời:


8

Từ khóa ở đây để hiểu nhóm của bạn đến từ đâu là "microservice". Trước tiên, đáng để đọc về khái niệm đó, đặc biệt là các thông tin sau:

  • Dữ liệu nên được lưu trữ như thế nào?
  • Nguyên tắc thiết kế?
  • Làm thế nào chúng được thiết kế để mở rộng quy mô?

Như với bất kỳ cách làm tương đối mới nào (và 5-10 năm là tương đối mới khi nói đến kiến ​​trúc phần mềm), bạn sẽ thấy rằng lý tưởng và thực tế có một chút khác biệt.

Một trong những lý tưởng là mọi microservice nên có kho dữ liệu riêng. LƯU Ý: Tôi đã nói lưu trữ dữ liệu, không phải cơ sở dữ liệu. Có những trường hợp bạn chỉ muốn một công cụ tìm kiếm, lưu trữ blob hoặc bộ nhớ đệm đơn giản trái ngược với cơ sở dữ liệu thông thường. Tùy thuộc vào người bạn nói chuyện, lý tưởng đó thậm chí có thể đi đến một cửa hàng dữ liệu cho mỗi phiên bản microservice!

Điểm mấu chốt là khi bạn nói về việc chuyển sang quy mô internet, sự an toàn và quen thuộc của các giao dịch ACID (Nguyên tử, Tính nhất quán, Cách ly và Độ bền) sẽ không mở rộng khi bạn có hàng triệu người dùng trên một cơ sở dữ liệu. Với sự ra đời của NoQuery, mô hình đã chuyển hướng nhiều hơn sang BASE (Cơ bản có sẵn, trạng thái mềm, tính nhất quán cuối cùng). ( tham khảo )

Có tác động thay đổi PH về cách bạn quản lý dữ liệu:

  • Những điều mà cơ sở dữ liệu được sử dụng để chăm sóc cho bạn phải được quản lý theo mã ngay bây giờ
  • Việc mở rộng quy mô dễ dàng hơn bằng cách ném nhiều phiên bản microservice vào một vấn đề hơn là thêm tài nguyên "vô hạn" vào máy chủ
  • Bạn tăng độ tin cậy với chi phí tăng độ phức tạp

Tôi không thể trả lời cho các chi tiết về nhóm của bạn hoặc họ dự định giải pháp lớn đến mức nào, nhưng thông thường bạn không cần phải có giải pháp tất cả hoặc không có gì. Tôi sẽ không ngồi đây và đánh giá xem đội có đưa ra lựa chọn đúng hay không. Tôi chỉ cung cấp cho bạn một số bối cảnh để bạn ít nhất có thể hiểu chúng đến từ đâu.


+1 Công cụ tuyệt vời - có rất nhiều sự tinh tế xung quanh microservice chắc chắn rằng điều đó không chỉ là một trường hợp hoán đổi cơ sở dữ liệu.
Robbie Dee

@RobbieDee, đồng ý. Có rất nhiều điều phức tạp trong thế giới đó, và không phải ai cũng đồng ý về các chi tiết.
Berin Loritsch

Đây nên là câu trả lời. Một chút về mỗi microservice có kho lưu trữ dữ liệu riêng của nó thực sự là yếu tố khác biệt. Nó tạo ra một sự thay đổi lớn trong nhu cầu và giải pháp lưu trữ dữ liệu của bạn và một kho lưu trữ dữ liệu tuân thủ ACID không mang lại nhiều lợi ích như trước đây.
Greg Burghardt

7
Đó là một câu trả lời tốt, và tôi đã nâng cao nó. Tôi chỉ chỉ ra rằng những gì bạn gọi là "quy mô internet" chỉ áp dụng cho các công ty lớn nhất ; đối với phần lớn các cơ sở dữ liệu và trang web của công ty (tôi muốn nói là 95% trong số họ), cơ sở dữ liệu SQL chuẩn hóa "thông thường" vẫn hoàn toàn khả thi.
Robert Harvey

@RobertHarvey, tôi đồng ý hết lòng. Tôi đã đọc nhiều bài viết về microservice chỉ định những gì tôi đã viết. Trong các dự án riêng của chúng tôi, chúng tôi sử dụng một cơ sở dữ liệu SQL với các ràng buộc và chuẩn hóa phù hợp. Nó sẽ làm tổn thương trái tim của người theo chủ nghĩa thuần túy, nhưng thực tế là cơ sở người dùng của chúng tôi khá nhỏ (hàng trăm hoặc người dùng) và cơ sở dữ liệu không phải là vấn đề về hiệu suất đối với chúng tôi.
Berin Loritsch

3

OK, không phải là kỹ sư chính của dự án, bạn thực sự phải làm theo chỉ dẫn của anh ấy cho dự án này.

Tôi sẽ khuyến khích bạn làm việc thông qua thiết kế hệ thống của riêng bạn và nguyên mẫu nó ở nhà để bạn hiểu bất kỳ sự đánh đổi nào. Làm điều này cho giáo dục của riêng bạn và chỉ đề cập đến nó trong công việc khi bạn có thể chứng minh các ví dụ làm việc.

Kinh nghiệm của tôi là có một tuyên bố rằng các ràng buộc gây ra sự chậm chạp trong hiệu suất cơ sở dữ liệu. Và vâng, nó sẽ, bạn phải kiểm tra những ràng buộc đó. Tuy nhiên, đó là một vấn đề lớn hơn nhiều khi cơ sở dữ liệu không nhất quán và điều này sẽ khiến bạn phải viết SQL và nhiều mã hơn để bù lại, thường làm tăng độ phức tạp của hệ thống cũng như làm chậm nó.

3nf, khi được thực hiện một cách thích hợp, sẽ làm cho cơ sở dữ liệu nhanh hơn vì nhiều dữ liệu hơn có thể được lưu trong bộ nhớ cache vì có ít dữ liệu dư thừa được lưu trữ. Tuy nhiên, trong công việc hiện tại của bạn, có thể không có một bộ dữ liệu đủ lớn để thực sự thấy sự khác biệt về hiệu suất giữa cơ sở dữ liệu được chuẩn hóa và cơ sở dữ liệu không chuẩn hóa.


+1 Ý tưởng tuyệt vời. Và nếu âm lượng quá lớn đối với máy dev, mẫu 1 trong N thường có thể mang lại những hiểu biết tuyệt vời.
Robbie Dee

2

Tôi nghĩ rằng họ sợ tái tạo lại "trò hề" cũ đã có trước đây, thay vì chính Tính toàn vẹn tham chiếu.

Ông lập luận rằng ở những nơi tôi muốn nguyên tử, chúng ta không cần nó ...

Nếu bạn có thể tạo ra một trường hợp chắc chắn (còn gọi là Yêu cầu phi chức năng) để cần nguyên tử, thì họ sẽ cần một đối số vững chắc, tốt để thoát khỏi việc cung cấp nó.

... Thay vì truy vấn, chúng ta nên làm nhiều thứ hơn trong bộ nhớ. Đây là một nguyên tắc thiết kế ... Chúng tôi không dự đoán rằng khối lượng dữ liệu của chúng tôi sẽ tăng đáng kể ...

Hãy hy vọng bạn đúng. Tôi sẽ đề nghị rằng việc dựa vào dữ liệu ở mức "đủ nhỏ" để duy trì hiệu suất là rủi ro.

Ngoài ra, tỷ lệ thay đổi trên các quy tắc này là gì? Bạn càng có nhiều bản sao, bạn càng mất nhiều thời gian (còn gọi là tiền), bạn sẽ lãng phí khi cập nhật cùng một thứ ở nhiều nơi.


1

Các khái niệm chính đằng sau RDBMS đã hơn 40 năm tuổi. Hồi đó việc lưu trữ rất tốn kém và bất kỳ loại dư thừa nào cũng được tán thành. Trong khi các khái niệm đằng sau RDBMS vẫn còn âm thanh, ý tưởng về sự không chuẩn hóa cho hiệu suất (để giảm sự tham gia) đã trở nên phổ biến trong những thập kỷ gần đây.

Vì vậy, đối với RDBMS có kích thước nhất định, bạn thường có thiết kế logic (không có dự phòng) và thiết kế vật lý (có dự phòng) cho hiệu suất.

Chuyển nhanh đến ngày hôm nay nơi lưu trữ rẻ và bộ xử lý nhanh hơn bao giờ hết, một số áp lực thiết kế đó không quá quan trọng. Cuối cùng, đó là một lời kêu gọi về việc bạn có quan tâm đến hồ sơ dư thừa và trẻ mồ côi hay không. Đối với một số ngành như ngân hàng, tính chính xác của dữ liệu là rất quan trọng vì vậy thật khó để thấy họ sẽ rời khỏi RDBMS như thế nào. Đối với các ngành công nghiệp khác, người chơi mới đang tham gia thị trường mọi lúc nên các lựa chọn là vô số.

Còn về việc nhóm của bạn có khó chịu với những hạn chế mà RDBMS có thể mang lại hay không - ai biết? Chắc chắn các nhà phát triển cơ sở mà tôi thấy không có RDBMS mà các nhà phát triển của các thế hệ trước đã làm, nhưng điều này có lẽ liên quan nhiều hơn đến sự phát triển của các công nghệ phát triển và nền tảng cơ sở dữ liệu.

Không có kết thúc của các công nghệ mà một nhà phát triển có thể học hỏi và thật khó để tạo ra những cú hích phù hợp cho sự nghiệp của bạn. Chắc chắn thời của các nhà phát triển là người nắm giữ tất cả các giao dịch đã qua từ lâu - có quá nhiều thứ mà người ta có thể học hỏi.

Nhưng - với câu hỏi trong tay. Bằng cách nhập học của riêng bạn, bạn không hy vọng khối lượng dữ liệu sẽ tăng lên và hệ thống đang hoạt động tốt. Sẽ là khá khó khăn để bạn bán ý tưởng tái thiết kế những thứ không có lợi ích có thể nhận thấy. Có lẽ nếu bạn có thể làm một bằng chứng về khái niệm trong đó cách tiếp cận RDBMS đã gặt hái được lợi ích, đó sẽ là một câu chuyện khác.


1
Tại sao điều này bị hạ cấp? Đây là câu trả lời cân bằng. chủ nghĩa thực dụng +1
Dirk Boer

Chủ nghĩa thực dụng là tốt, nhưng bạn vẫn phải cẩn thận. Không chuẩn hóa dữ liệu trong tên của hiệu suất khi bắt đầu một dự án tối ưu hóa sớm. Không tái thiết kế một hệ thống cũ hoạt động rõ ràng là một lựa chọn tốt, thực dụng, nhưng từ chối thiết kế một hệ thống mới theo tiêu chuẩn công nghiệp với cái tên "chúng tôi luôn làm ngược lại và nó hoạt động" không phải là một lý lẽ tốt .
Vincent Savard

Không chuẩn hóa dữ liệu trong tên hiệu suất khi bắt đầu dự án ... Gợi ý: bạn không :)
Robbie Dee

1
Giá trị của RDBMS không đến từ hiệu quả đĩa.
TehShrike

0

Nó phụ thuộc vào cơ sở dữ liệu bạn đang sử dụng.

Trong một RDBMS truyền thống, bạn đã đúng. Sao chép dữ liệu là một sự gớm ghiếc. Các cột và tương đương json của chúng chắc chắn sẽ không đồng bộ vì không có gì để thực thi nó. Hỗ trợ khóa ngoại được biết đến, làm một công việc tuyệt vời trong việc mô tả và thực thi các mối quan hệ. Và nguyên tử là rất quan trọng để làm hầu hết mọi thứ với dữ liệu.

Trong một loại thiết lập nosql, nó ít rõ ràng hơn. Vì không có quan hệ vững chắc, việc thực thi các mối quan hệ trở nên ít quan trọng hơn. Loại nội dung json với chỉ mục cột phổ biến hơn rất nhiều trên các hệ thống này bởi vì không có mối quan hệ nào có nghĩa là nó ít có khả năng không đồng bộ hóa. Và tính nguyên tử bị ràng buộc trong một bảng vì đó là cách nosql hoạt động.

Cái nào tốt hơn phụ thuộc vào những gì bạn thực sự đang làm, và những gì bạn thực sự cần.

Nhưng có vẻ như đồng nghiệp của bạn đang ở trong một giáo phái vận chuyển hàng hóa. Họ đã bị cắn bởi những thứ xấu cũ, vì vậy bây giờ mọi thứ cần phải là thứ sáng bóng mới. Trong một vài năm, một khi họ đã bị cắn bởi thứ bóng bẩy mới, họ hy vọng sẽ nhận ra rằng SQL vs noQuery là một tập hợp của sự đánh đổi.

Nhưng họ sẽ không. Hy vọng bạn sẽ mặc dù.

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.