ORM có thúc đẩy quá trình khử chuẩn hóa cơ sở dữ liệu không?


14

Cả Doctrine và Propel đều sử dụng kế thừa bảng đơn và cụ thể để ánh xạ các mối quan hệ đối tượng. Cái trước nhìn thấy tất cả các trường có thể trong cây lớp được ánh xạ vào một bảng duy nhất - trong khi cái sau ánh xạ mỗi lớp vào một bảng cụ thể, sao chép các trường chung trong hệ thống phân cấp thừa kế.

Trong khi điều này tạo điều kiện cho bộ máy ORM, nó gợi ý cho tôi thiết kế cơ sở dữ liệu xấu. Là những mẫu thiết kế xấu để thực thi trên cơ sở dữ liệu?

Câu trả lời:


4

Không thể nói liệu một thiết kế cơ sở dữ liệu cụ thể có xấu hay không mà không biết ứng dụng đang làm gì, hình dạng của dữ liệu, kỳ vọng về hiệu năng, v.v. Mặc dù thông thường hóa (ở một mức độ nào đó) được coi là thực tiễn tốt nhất, nhưng khá phổ biến đối với các khu vực cơ sở dữ liệu vì lý do hiệu suất rất tốt và xấu là rất nhiều để thảo luận mà không có nhiều dữ liệu hơn so với hầu hết mọi người khi họ bắt đầu.

Thêm vào nhiều cách tiếp cận có thể được đưa ra để phản đối ánh xạ quan hệ và mọi thứ trở nên phức tạp hơn vì cấu trúc cơ sở dữ liệu "tốt nhất" sẽ phụ thuộc vào mô hình đối tượng cụ thể, mức độ kế thừa, v.v.

Bằng cách lấy một kích thước phù hợp với tất cả các thư viện kiên trì ORM sẽ luôn tạo ra cấu trúc cơ sở dữ liệu không tối ưu cho bất kỳ tình huống cụ thể nào và sẽ sử dụng một số điều có thể được coi là thực tiễn xấu cho tình huống cụ thể đó .

Bạn chắc chắn có thể viết một ORM đã được chuẩn hóa nhưng bạn sẽ thấy hàm ý hiệu năng khá lớn vì mỗi lần chèn vào một bảng chính, nó cần quét các bảng tra cứu khác nhau để xem các giá trị có tồn tại không, nếu chúng có lấy khóa của chúng và nếu chúng không có khóa 't thực hiện các chèn có liên quan.

(Khi bạn làm điều này bằng tay, bạn có thể cắt ngắn một số điều này vì bạn biết rằng bạn đã đưa chúng xuống chỉ chứa giá trị hợp lệ để bạn không cần phải thực hiện các tra cứu này, bạn chỉ cần sử dụng khóa hạnh phúc để hợp lệ, ORM không thể đưa ra giả định đó vì nó không kiểm soát UI.)

Nhưng điều bạn phải nhớ là họ không nhằm tối ưu hóa hiệu suất cơ sở dữ liệu hoặc tính toàn vẹn dữ liệu, họ đang tối ưu hóa cho tốc độ phát triển . Nếu cấu trúc cụ thể của dữ liệu của bạn là quan trọng đối với bạn thì bạn cần phải viết mã ánh xạ đối tượng / RDBMS bằng tay hoặc ít nhất là đánh giá chi tiết tất cả các thư viện có sẵn và chọn một thư viện đáp ứng hầu hết nhu cầu của bạn ( nếu một cái tồn tại).

Về cơ bản, nó đi theo yêu cầu và đánh đổi giữa dữ liệu có cấu trúc tốt, hiệu suất cơ sở dữ liệu và tốc độ phát triển. Cũng như nhiều sự đánh đổi, bạn không được chọn cả ba.


Tôi sẽ không bao giờ sử dụng các phím tắt trên đó hoặc kiểm tra rõ ràng rằng các giá trị tồn tại trong các bảng tra cứu khác nhau. Tôi sẽ sử dụng các ràng buộc khóa ngoại để đảm bảo nó. Tôi hy vọng một ORM tốt sẽ làm như vậy.
David Conrad

7

Theo nguyên tắc thông thường, không bao giờ mô hình hóa dữ liệu của bạn để đáp ứng nhu cầu của nhà phát triển (Bạn có thể sử dụng Chế độ xem hoặc Sp cho điều đó, nhưng không phải là Mô hình dữ liệu).

Mô hình dữ liệu phải dựa trên các quy tắc nghiệp vụ của ứng dụng và nhu cầu về hiệu năng.


6

Tôi không đồng ý rằng ORM khuyến khích khử chuẩn hóa hoặc thiết kế cơ sở dữ liệu xấu. Trên thực tế, các cơ sở dữ liệu được thiết kế tồi nhất mà tôi thấy đã được thực hiện mà không có ORM. Bằng cách làm cho nó đơn giản để có các mối quan hệ phù hợp dựa trên id hàng thay vì tạo một mối quan hệ dựa trên giá trị của một trường ngẫu nhiên, nó thúc đẩy thiết kế cơ sở dữ liệu tốt.

Có thể nó không thúc đẩy quá trình chuẩn hóa, nhưng sau đó lại là một ORM nơi dễ dàng tạo các bảng / đối tượng và các mối quan hệ gần như có thể được nhìn thấy để thúc đẩy điều đó. Sẽ không có nhiều công việc trong ORM để tạo bảng "vị trí" có địa chỉ và liên kết nhân viên với vị trí thay vì thêm địa chỉ vào bảng nhân viên. Nhưng không có ORM, tách ra khỏi vị trí có nghĩa là bất cứ khi nào bạn muốn truy cập vào vị trí đó, bạn cần phải tham gia.

Vì vậy, câu trả lời của tôi là: Không, tôi không nghĩ vậy . Thực tế có thể là cách khác, một ORM tốt khuyến khích thiết kế cơ sở dữ liệu tốt, ít nhất là về những người có ít kinh nghiệm.


1
Và nhiều ORM có khả năng kế thừa nhiều bảng: (N) Hibernate và RoR ActiveRecord làm, chẳng hạn.
rsenna
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.