Là mối quan hệ một-một được bình thường hóa?


12

Hãy xem xét chúng tôi có một bộ dữ liệu thống kê lớn cho một bản ghi; ví dụ 20-30 INTcột. Có tốt hơn không khi giữ toàn bộ tập hợp trong một bảng vì tất cả chúng đều thuộc về một bản ghi HOẶC tạo một bảng khác được kết nối với mối quan hệ một-một.

Ưu điểm trước đây là tránh JOINvà truy cập nhanh vào tất cả dữ liệu thống kê cho hồ sơ tương ứng.

Ưu điểm của cái sau là giữ cho cột gọn gàng. Cột đầu tiên là chuyên sâu đọc và thứ hai viết chuyên sâu. Tất nhiên, tôi nghĩ rằng nó không có ảnh hưởng đáng kể đến hiệu suất, vì tôi sử dụng InnoDB với tính năng chặn hàng.

Nói chung tôi muốn biết liệu có hữu ích khi tách các bộ dữ liệu khác nhau cho một bản ghi không?


2
'Chuẩn hóa' có nghĩa là dạng bình thường đầu tiên (1NF) và là một yêu cầu cơ bản của mô hình quan hệ. 'Bình thường hóa hoàn toàn' có nghĩa là 5NF trở lên. Bảng 'mối quan hệ một-một' được đề xuất của bạn có cơ hội ở dạng bình thường cao hơn (thậm chí là 6NF) so với bảng hiện tại của bạn vì nó bị phân hủy! Những hình thức bình thường nào mà bảng hiện tại của bạn đáp ứng?
onedaywhen

@encedaywhen Giống như nhiều người khác Tôi không theo dõi bình thường hóa từng bước, vì đôi khi việc không chuẩn hóa cũng hữu ích. Nói chung, toàn bộ cơ sở dữ liệu phải có mức chuẩn hóa trong khoảng 3NF - 5NF (Tôi luôn gặp sự cố với 4NF!)
Googlebot

Câu trả lời:


19

Nếu nó phù hợp với các quy tắc chuẩn hóa, thì các mối quan hệ 1: 1 có thể được chuẩn hóa (theo định nghĩa!) - Nói cách khác, không có gì về các mối quan hệ 1: 1 khiến chúng không thể tuân theo các hình thức thông thường.

Để trả lời câu hỏi của bạn về tính thực tế của các mối quan hệ 1: 1, có những lúc đây là một cấu trúc hoàn toàn hữu ích, chẳng hạn như khi bạn có các kiểu con với các vị từ (cột) riêng biệt.

Những lý do bạn sẽ sử dụng các mối quan hệ 1: 1 tùy thuộc vào quan điểm của bạn. Các DBA có xu hướng nghĩ mọi thứ là một quyết định hiệu suất. Các nhà lập mô hình dữ liệu và lập trình viên có xu hướng nghĩ về các quyết định này là thiết kế hoặc định hướng mô hình. Trong thực tế, có rất nhiều sự chồng chéo giữa các quan điểm này. Nó phụ thuộc vào quan điểm và ưu tiên của bạn là gì. Dưới đây là một số ví dụ về động lực cho các mối quan hệ 1: 1:

  • Bạn có một số tập hợp con của các cột rất rộng và bạn muốn tách riêng chúng trong bộ lưu trữ của bạn vì lý do hiệu suất.

  • Bạn có một số tập hợp con của các cột không được đọc hoặc cập nhật thường xuyên và bạn muốn tách chúng ra khỏi các cột được sử dụng thường xuyên vì lý do hiệu suất.

  • Bạn có một số cột là tùy chọn nói chung nhưng chúng là bắt buộc khi bạn biết rằng bản ghi là một loại nhất định.

  • Bạn có một số cột thuộc về nhau một cách hợp lý cho một kiểu con và bạn muốn mô hình hóa chúng để phù hợp với mô hình đối tượng mã của bạn.

  • Bạn có một số cột chỉ có thể áp dụng cho một số kiểu con của siêu loại thực thể và bạn muốn lược đồ của mình thực thi việc không có dữ liệu này cho các kiểu con khác.

  • Bạn có một số cột thuộc về một thực thể nhưng bạn cần bảo vệ các cột cụ thể này bằng cách sử dụng các quy tắc truy cập hạn chế hơn (ví dụ: tiền lương trên bảng nhân viên).

Vì vậy, bạn có thể thấy, đôi khi trình điều khiển là hiệu suất, đôi khi nó là độ tinh khiết của mô hình hoặc chỉ là mong muốn tận dụng tối đa các quy tắc lược đồ khai báo.


You have some subset of columns that are very wide and you want to segregate them physically in your storage for performance reasons.Làm thế nào để tách riêng chúng cải thiện hiệu suất (giả sử các cột luôn được truy cập mỗi khi bảng chính)?
Gili

@Gili - Nếu giả định của bạn là đúng thì trường hợp này sẽ không áp dụng. Việc tách các cột lớn và không thường xuyên cho phép nhiều hàng hơn phù hợp trên một trang, do đó cho phép truy xuất nhanh hơn các cột thường được sử dụng. Rõ ràng việc đọc các cột tách biệt cùng với các cột thường được sử dụng sẽ chậm hơn vì việc nối là cần thiết.
Joel Brown

Tôi muốn tách riêng các cột thường được sử dụng vì lý do thiết kế (tách mối quan tâm, tăng sử dụng lại mã). Có ai đã đăng một ước tính chi phí của các tham gia như vậy? Có phải họ không đáng kể hoặc một cái gì đó tôi nên lo lắng về lâu dài?
Gili

@Gili - re: chi phí tham gia: Không có câu trả lời đúng cho câu hỏi đó ngoài "nó phụ thuộc". Chi phí tham gia bị ảnh hưởng bởi nhiều yếu tố. Cho dù họ không đáng kể thậm chí còn khó trả lời hơn, vì điều đó cuối cùng là chủ quan. Cách tốt nhất để trả lời câu hỏi của bạn là giả lập một số dữ liệu kiểm tra và kiểm tra khối lượng. Hãy thử cả hai cách và xem liệu bạn có thể cho biết sự khác biệt bằng cách sử dụng khối lượng dữ liệu trong thế giới thực (bất cứ điều gì ngụ ý cho ứng dụng của bạn).
Joel Brown

Tôi đã làm và nhận được kết quả đáng ngạc nhiên: dba.stackexchange.com/q/74693/4719 Tôi thừa nhận đây không phải là một ví dụ điển hình về bình thường hóa, nhưng nó không nhấn mạnh rằng THAM GIA (vẫn) rất đắt.
Gili

4

Những lý do chính khiến bạn sử dụng ánh xạ một-một để chia một bảng lớn thành hai là vì lý do hiệu suất chẳng hạn:

a) Bảng có dữ liệu nhị phân / clob / blob trong bảng thường xuyên truy cập do đó làm chậm hiệu suất do các cột lớn được xử lý khác nhau.

b) Bảng có nhiều cột được truy cập bởi các truy vấn khác nhau, do đó hiệu suất bị giảm do đó bạn sẽ di chuyển các cột có liên quan vào một bảng riêng để cải thiện hiệu suất truy cập

Tuy nhiên, việc có nhiều cột số nguyên không chứng minh nỗ lực bổ sung của việc chia bảng thành các bảng riêng biệt và phải truy vấn chúng.


điểm rất tốt để làm rõ vấn đề!
Googlebot
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.