Triển khai kiểu con của một kiểu con trong mẫu thiết kế kiểu / kiểu con với các lớp con loại trừ lẫn nhau


20

Giới thiệu

Để câu hỏi này hữu ích cho những người đọc trong tương lai, tôi sẽ sử dụng mô hình dữ liệu chung để minh họa vấn đề tôi gặp phải.

Mô hình dữ liệu của chúng tôi bao gồm 3 đơn vị, trong đó phải được dán nhãn là A, BC. Để giữ cho mọi thứ đơn giản, tất cả các thuộc tính của chúng sẽ thuộc intloại.

Entity Ađã thuộc tính sau: D, EX;

Entity Bđã thuộc tính sau: D, EY;

Thực thể Ccó các thuộc tính sau: DZ;

Vì tất cả các thực thể chia sẻ thuộc tính chung D, tôi đã quyết định áp dụng thiết kế kiểu / kiểu con .

Quan trọng: Các thực thể là loại trừ lẫn nhau! Điều này có nghĩa là thực thể đó là A hoặc B hoặc C.

Vấn đề:

Các thực thể ABcó một thuộc tính chung khác E, nhưng thuộc tính này không có trong thực thể C.

Câu hỏi:

Tôi muốn sử dụng các đặc tính được mô tả ở trên để tiếp tục tối ưu hóa thiết kế của mình, nếu có thể.

Thành thật mà nói, tôi không biết làm thế nào để làm điều này, cũng như không bắt đầu thử ở đâu, do đó bài đăng này.

Câu trả lời:


6

Trong trường hợp Câu hỏi này là sự tiếp nối của việc triển khai mẫu thiết kế kiểu / kiểu con (đối với các lớp con loại trừ lẫn nhau) có đúng không? , Mà là chính nó một sự tiếp nối của Đỗ không biết làm thế nào để chuyển đổi thực thể biến thành bảng quan hệ , tôi sẽ hỏi: những gì chính xác là bạn cố gắng để tối ưu hóa? Lưu trữ? Mô hình đối tượng? Truy vấn phức tạp? Hiệu năng truy vấn? Có sự đánh đổi khi tối ưu hóa một khía cạnh so với một khía cạnh khác vì bạn không thể tối ưu hóa tất cả các khía cạnh cùng một lúc.

Tôi hoàn toàn đồng ý với quan điểm của Remus về:

  • Có những ưu và nhược điểm đối với từng phương pháp (tức là yếu tố "nó phụ thuộc" hiện tại) và
  • Ưu tiên hàng đầu là hiệu quả của mô hình dữ liệu (mô hình dữ liệu không hiệu quả có thể được sửa bằng mã ứng dụng sạch và / hoặc hiệu quả)

Điều đó nói rằng, sự lựa chọn mà bạn phải đối mặt là giữa các điều sau đây, được sắp xếp theo thứ tự ít chuẩn hóa nhất để chuẩn hóa nhất:

  • quảng bá tài sản Elên bảng loại cơ sở
  • giữ nó trong nhiều bảng phụ
  • bình thường hóa hoàn toàn Evới một bảng lớp con trung gian mới ở cùng cấp độ với C, ABsẽ trực tiếp là các lớp con của ( câu trả lời của @ MDCCL )

Hãy xem xét từng lựa chọn:

Di chuyển thuộc tính Esang loại cơ sở

CHUYÊN NGHIỆP

  • Phức tạp truy vấn giảm cho các truy vấn mà nhu cầu Enhưng không X, Yhoặc Z.
  • Có khả năng hiệu quả hơn cho các truy vấn mà nhu cầu Enhưng không X, Yhoặc Z(truy vấn đặc biệt là tổng hợp) do không JOIN.
  • Tiềm năng tạo chỉ mục trên (D, E)(và nếu vậy, có khả năng là Chỉ mục được lọc ở (D, E)nơi EntityType <> C, nếu điều kiện như vậy được cho phép)

CON

  • Không thể đánh dấu ENOT NULL
  • Cần thêm CHECK CONSTRAINTtrên bảng loại cơ sở để đảm bảo rằng E IS NULLkhi EntityType = C(mặc dù đây không phải là vấn đề lớn)
  • Cần giáo dục người dùng mô hình dữ liệu về lý do tại sao Ephải NULLvà thậm chí nên bỏ qua hoàn toàn, khi EntityType = C.
  • Hơi kém hiệu quả khi Elà loại có độ dài cố định một phần lớn các hàng dành cho EntityType của C(nghĩa là không sử dụng Evì vậy NULL) không sử dụng SPARSEtùy chọn trên cột hoặc Nén dữ liệu trên Chỉ mục cụm
  • Có khả năng kém hiệu quả hơn đối với các truy vấn không cần Evì sự hiện diện của Ebảng loại cơ sở sẽ làm tăng kích thước của mỗi hàng, từ đó làm giảm số lượng hàng có thể vừa trên một trang dữ liệu. Nhưng điều này phụ thuộc nhiều vào kiểu dữ liệu chính xác của EFILLFACTOR, có bao nhiêu hàng trong bảng kiểu cơ sở, v.v.

Giữ tài sản Etrong mỗi loại bảng phụ

CHUYÊN NGHIỆP

  • Mô hình dữ liệu sạch hơn (nghĩa là không phải lo lắng về việc giáo dục người khác về lý do tại sao Ekhông nên sử dụng cột trong bảng loại cơ sở vì "thực sự không có ở đó")
  • Có lẽ gần giống với mô hình đối tượng hơn
  • Có thể đánh dấu cột như NOT NULLthể đây là thuộc tính bắt buộc của thực thể
  • Không cần thêm CHECK CONSTRAINTvào bảng loại cơ sở để đảm bảo rằng E IS NULLkhi EntityType = C(mặc dù đây không phải là một mức tăng lớn)

CON

  • Yêu cầu THAM GIA để loại bảng phụ để có được tài sản này
  • Có khả năng kém hiệu quả hơn một chút khi cần E, do THAM GIA, tùy thuộc vào số lượng hàng A+ Bbạn có so với số lượng hàng Ccó bao nhiêu .
  • Hơi khó khăn / phức tạp hơn đối với các hoạt động chỉ liên quan đến các thực thể AB(và không C ) là cùng một loại. Tất nhiên, bạn có thể trừu tượng hóa điều này thông qua Chế độ xem UNION ALLnằm giữa một SELECTtrong các bảng đã THAM GIA Avà một SELECTbảng khác đã tham gia B. Điều đó sẽ làm giảm độ phức tạp của các truy vấn CHỌN nhưng không hữu ích cho các truy vấn INSERTUPDATEtruy vấn.
  • Tùy thuộc vào các truy vấn cụ thể và tần suất chúng được thực hiện, đây có thể là một sự không hiệu quả tiềm năng trong trường hợp có một chỉ mục trên (D, E)thực sự sẽ giúp một hoặc nhiều truy vấn được sử dụng thường xuyên, vì chúng không thể được lập chỉ mục cùng nhau.

Chuẩn hóa Era bảng trung gian giữa lớp cơ sở và A&B

(Xin lưu ý rằng tôi thích câu trả lời của @ MDCCL như một sự thay thế khả thi, tùy thuộc vào hoàn cảnh. Điều sau đây không có nghĩa là một sự chỉ trích nghiêm ngặt về cách tiếp cận đó, mà là một phương tiện để thêm một số quan điểm - tất nhiên - bằng cách đánh giá nó trong cùng bối cảnh với hai tùy chọn mà tôi đã đề xuất. Điều này sẽ giúp dễ dàng làm rõ hơn những gì tôi thấy là sự khác biệt tương đối giữa chuẩn hóa hoàn toàn và cách tiếp cận hiện tại của chuẩn hóa một phần.)

CHUYÊN NGHIỆP

  • mô hình dữ liệu được chuẩn hóa hoàn toàn (không thể có bất kỳ điều gì sai với điều này, vì đó là những gì RDBMS được thiết kế để làm)
  • giảm độ phức tạp truy vấn cho các truy vấn cần AB, nhưng không C(nghĩa là không cần hai truy vấn được nối qua UNION ALL)

CON

  • chiếm thêm một chút dung lượng ( Barbảng nhân đôi ID và có một cột mới, BarTypeCode) [không đáng kể, nhưng cần lưu ý]
  • tăng nhẹ độ phức tạp của truy vấn vì JOINcần bổ sung để có được AhoặcB
  • tăng diện tích bề mặt để khóa, chủ yếu là trên INSERT( DELETEcó thể được xử lý hoàn toàn thông qua việc đánh dấu Khóa ngoài là ON CASCADE DELETE) vì Giao dịch sẽ được mở lâu hơn một chút trên bảng lớp cơ sở (tức là Foo) [không đáng kể, nhưng cần lưu ý]
  • không có kiến ​​thức trực tiếp về loại thực tế - Ahoặc B- trong Bảng lớp cơ sở , Foo; nó chỉ biết loại Brcó thể là Ahoặc B:

    Có nghĩa là, nếu bạn cần thực hiện các truy vấn trên thông tin cơ sở chung nhưng cần phân loại theo loại thực thể hoặc lọc ra một hoặc nhiều loại thực thể, thì bảng lớp cơ sở không có đủ thông tin, trong trường hợp đó bạn cần phải LEFT JOINcái Barbàn Điều này cũng sẽ làm giảm hiệu quả của việc lập chỉ mục FooTypeCodecột.

  • không có cách tiếp cận nhất quán để tương tác với A& Bvs C:

    Có nghĩa là, nếu mỗi thực thể liên quan trực tiếp đến bảng lớp cơ sở sao cho chỉ có một THAM GIA để có được thực thể đầy đủ, thì mọi người có thể nhanh chóng và dễ dàng xây dựng sự quen thuộc hơn khi làm việc với mô hình dữ liệu. Sẽ có một cách tiếp cận chung cho các truy vấn / Thủ tục lưu trữ giúp chúng phát triển nhanh hơn và ít có lỗi hơn. Một cách tiếp cận nhất quán cũng làm cho việc thêm các kiểu con mới trong tương lai nhanh hơn và dễ dàng hơn.

  • có khả năng ít thích ứng với các quy tắc kinh doanh thay đổi theo thời gian:

    Có nghĩa là, mọi thứ luôn thay đổi và khá dễ dàng để di chuyển Elên Bảng lớp cơ sở nếu nó trở nên phổ biến cho tất cả các loại phụ. Cũng đủ dễ dàng để chuyển một thuộc tính chung ra các loại phụ nếu những thay đổi về bản chất của các thực thể làm cho điều đó trở thành một thay đổi đáng giá. Thật dễ dàng để chia một loại phụ thành hai loại phụ (chỉ cần tạo một SubTypeIDgiá trị khác ) hoặc kết hợp hai hoặc nhiều loại phụ thành một. Ngược lại, nếu Esau này trở thành một tài sản chung của tất cả các loại phụ thì sao? Sau đó, lớp trung gian của Barbảng sẽ là vô nghĩa, và sự phức tạp thêm vào sẽ không đáng giá. Tất nhiên, không thể biết liệu một sự thay đổi như vậy sẽ xảy ra trong 5 hay thậm chí 10 năm nữa, vì vậy Barbảng không nhất thiết phải, thậm chí rất có khả năng là một ý tưởng tồi (đó là lý do tại sao tôi nói " có khả năng ít thích nghi hơn"). Đây chỉ là những điểm cần xem xét; đó là một canh bạc theo cả hai hướng.

  • nhóm có khả năng không phù hợp:

    Có nghĩa là, chỉ vì thuộc Etính được chia sẻ giữa các loại thực thể ABkhông có nghĩa là AB nên được nhóm lại với nhau. Chỉ vì những thứ "trông" giống nhau (nghĩa là cùng một thuộc tính) không có nghĩa là chúng giống nhau.

Tóm lược

Cũng giống như quyết định nếu / khi nào không chuẩn hóa, làm thế nào để tiếp cận tốt nhất tình huống cụ thể này phụ thuộc vào việc xem xét các khía cạnh sau của việc sử dụng mô hình dữ liệu và đảm bảo rằng lợi ích vượt xa chi phí:

  • bạn sẽ có bao nhiêu hàng cho mỗi EntityType (nhìn ít nhất 5 năm sau, giả sử tăng trưởng trung bình)
  • mỗi bảng này sẽ có bao nhiêu GB (loại cơ sở và loại phụ) trong 5 năm?
  • kiểu dữ liệu cụ thể nào là tài sản E
  • nó chỉ là một tài sản hoặc có một vài, hoặc thậm chí một vài thuộc tính
  • những truy vấn nào bạn sẽ cần yêu cầu đó Evà tần suất chúng sẽ được thực hiện
  • Những truy vấn nào bạn sẽ cần mà không cần Evà tần suất chúng sẽ được thực hiện

Tôi nghĩ rằng tôi có xu hướng mặc định giữ Ecác bảng loại phụ riêng biệt bởi vì ít nhất nó là "sạch hơn". Tôi sẽ xem xét chuyển Esang bảng loại cơ sở IF: hầu hết các hàng không dành cho EntityType của C; số lượng hàng ít nhất là hàng triệu; tôi thường xuyên thực hiện các truy vấn không cần thực hiện Evà / hoặc các truy vấn sẽ được hưởng lợi từ một chỉ mục (D, E)hoặc thực hiện rất thường xuyên và / hoặc yêu cầu đủ tài nguyên hệ thống để có chỉ mục làm giảm việc sử dụng tài nguyên tổng thể, hoặc ít nhất là ngăn chặn tăng tiêu thụ tài nguyên vượt quá mức chấp nhận được hoặc kéo dài đủ lâu để gây ra sự ngăn chặn quá mức và / hoặc gia tăng các bế tắc.


CẬP NHẬT

OP nhận xét về câu trả lời này rằng:

Chủ nhân của tôi đã thay đổi logic kinh doanh, loại bỏ hoàn toàn E!

Sự thay đổi này đặc biệt quan trọng bởi vì đó chính xác là những gì tôi đã đưa ra có thể xảy ra trong phần phụ "CON" của phần "Chuẩn hóa Era bảng trung gian giữa lớp cơ sở và A& B" ở trên (điểm đạn thứ 6). Vấn đề cụ thể là việc tái cấu trúc mô hình dữ liệu dễ dàng / khó khăn như thế nào khi những thay đổi đó xảy ra (và chúng luôn luôn làm như vậy). Một số người sẽ lập luận rằng bất kỳ mô hình dữ liệu nào cũng có thể được cấu trúc lại / thay đổi, vì vậy hãy bắt đầu với lý tưởng. Nhưng trong khi sự thật ở mức độ kỹ thuật là bất cứ điều gì có thể được tái cấu trúc, thì thực tế của tình huống là vấn đề quy mô.

Tài nguyên không phải là vô hạn, không chỉ CPU / Đĩa / RAM, mà còn là tài nguyên phát triển: thời gian và tiền bạc. Các doanh nghiệp liên tục đặt ưu tiên cho các dự án vì những tài nguyên đó rất hạn chế. Và khá thường xuyên (ít nhất là theo kinh nghiệm của tôi), các dự án để đạt được hiệu quả (thậm chí cả hiệu năng hệ thống cũng như phát triển nhanh hơn / ít lỗi hơn) được ưu tiên bên dưới các dự án tăng chức năng. Mặc dù chúng tôi rất bực mình vì những người kỹ thuật bởi vì chúng tôi hiểu lợi ích lâu dài của các dự án tái cấu trúc là gì, đó chỉ là bản chất của kinh doanh mà những người kinh doanh ít kỹ thuật hơn có thể thấy mối quan hệ trực tiếp giữa chức năng mới và mới doanh thu. Điều này có nghĩa là: "chúng tôi sẽ quay lại để sửa lỗi đó sau" == "

Với ý nghĩ đó, nếu kích thước của dữ liệu đủ nhỏ để có thể thực hiện các thay đổi rất truy vấn và / hoặc bạn có một cửa sổ bảo trì đủ dài để không chỉ thực hiện các thay đổi mà còn quay ngược lại nếu có gì đó xảy ra sai, sau đó chuẩn hóa Era Bảng trung gian giữa bảng lớp cơ sở và bảng A& Blớp phụ có thể hoạt động (mặc dù điều đó vẫn khiến bạn không có kiến ​​thức trực tiếp về loại cụ thể ( AhoặcB) trong bảng lớp cơ sở). NHƯNG, nếu bạn có hàng trăm triệu hàng trong các bảng này và một lượng mã đáng kinh ngạc tham chiếu các bảng (mã phải được kiểm tra khi thực hiện thay đổi), thì nó thường trả tiền để thực dụng hơn lý tưởng. Và đây là môi trường mà tôi đã phải đối phó trong nhiều năm: 987 triệu hàng & 615 GB trong bảng lớp cơ sở, trải rộng trên 18 máy chủ. Và rất nhiều mã đánh vào các bảng này (bảng lớp cơ sở và lớp phụ) có rất nhiều sự kháng cự - chủ yếu là từ quản lý nhưng đôi khi từ các thành viên còn lại - để thực hiện bất kỳ thay đổi nào do số lượng phát triển và Tài nguyên QA cần được phân bổ.

Vì vậy, một lần nữa, cách tiếp cận "tốt nhất" chỉ có thể được xác định theo tình huống: bạn cần biết hệ thống của mình (nghĩa là có bao nhiêu dữ liệu và tất cả các bảng và mã liên quan), cách thực hiện tái cấu trúc và mọi người mà bạn làm việc với (nhóm của bạn và có thể là quản lý - bạn có thể mua lại cho một dự án như vậy không?). Có một số thay đổi mà tôi đã đề cập và lập kế hoạch trong 1 - 2 năm, và đã thực hiện nhiều lần chạy nước rút / phát hành để có thể thực hiện 85% trong số đó. Nhưng nếu bạn chỉ có <1 triệu hàng và không có nhiều mã được liên kết với các bảng này, thì có lẽ bạn có thể bắt đầu ở khía cạnh lý tưởng hơn / "thuần túy" hơn.

Chỉ cần nhớ, cho dù bạn chọn cách nào, hãy chú ý đến cách thức hoạt động của mô hình đó trong ít nhất 2 năm tới (nếu có thể). Hãy chú ý đến những gì hiệu quả và những gì gây ra nỗi đau, ngay cả khi nó dường như là ý tưởng lớn nhất vào thời điểm đó (có nghĩa là bạn cũng cần cho phép bản thân chấp nhận việc vặn vẹo - tất cả chúng ta đều làm - để bạn có thể đánh giá trung thực các điểm đau ). Và chú ý đến lý do tại sao một số quyết định có hiệu quả hoặc không để bạn có thể đưa ra quyết định có nhiều khả năng "tốt hơn" vào lần tới :-).


17

Theo Martin Fowler, có 3 cách tiếp cận vấn đề kế thừa bảng:

  • Kế thừa bảng đơn : Một bảng đại diện cho tất cả các loại. Các thuộc tính không sử dụng là NULLed.
  • Kế thừa bảng bê tông : Một bảng cho mỗi loại bê tông, mỗi cột cho mỗi thuộc tính của loại. Không có mối quan hệ giữa các bảng.
  • Kế thừa bảng lớp : Một bảng cho mỗi loại, mỗi bảng chỉ có các thuộc tính cho các thuộc tính mới, không được kế thừa. Các bảng có liên quan phản ánh hệ thống phân cấp thừa kế loại thực tế.

Bạn có thể bắt đầu với những điều này như một điểm khởi đầu để tìm kiếm những ưu và nhược điểm của từng phương pháp. Điểm chính của nó là tất cả các phương pháp đều có nhược điểm lớn, và không có ưu điểm nào vượt trội. Được biết đến như là sự không phù hợp trở kháng quan hệ đối tượng , vấn đề này vẫn chưa tìm ra giải pháp.

Cá nhân tôi thấy rằng loại vấn đề mà một thiết kế quan hệ xấu có thể dẫn đến là những mệnh lệnh nghiêm trọng hơn loại vấn đề phát sinh từ một thiết kế kiểu xấu . Thiết kế cơ sở dữ liệu xấu dẫn đến truy vấn chậm, cập nhật sự bất thường, bùng nổ kích thước dữ liệu, bế tắc và ứng dụng không phản hồi và hàng chục đến hàng trăm Gigabyte dữ liệu bị chìm ở định dạng sai . Thiết kế kiểu xấu dẫn đến khó duy trì và cập nhật , không phải thời gian chạy. Do đó, trong cuốn sách của tôi, thiết kế quan hệ chính xác hơn bất kỳ độ tinh khiết loại OO nào nhiều lần.


@AlwaysLearningNewStuff Tôi nghĩ rằng câu hỏi này là một câu hỏi tiếp theo trên dba.stackexchange.com/questions/139092 , đúng không? Trong việc thực hiện đó bạn làm có bảng thừa kế.
Remus Rusanu

Đúng vậy, trước khi đặt câu hỏi này, tôi muốn chắc chắn rằng tôi đã hiểu chính xác cách thực hiện thiết kế kiểu / kiểu con trước. Bây giờ tôi phải đối mặt với vấn đề được mô tả ở trên khi một số lớp con (nhưng không phải tất cả!) Có các thuộc tính được chia sẻ. Tôi đã tự hỏi liệu có điều gì tôi có thể làm để tối ưu hóa mô hình dữ liệu trong trường hợp đó hay không, thay vì bỏ qua sắc thái đó ...
Luôn luônLearningNewStuff

6

Theo giải thích của tôi về thông số kỹ thuật của bạn, bạn muốn tìm một phương pháp để thực hiện hai cách khác nhau (nhưng được kết nối cấu trúc siêu kiểu con ) .

Để đưa ra một cách tiếp cận để đạt được nhiệm vụ nói trên, tôi sẽ thêm vào kịch bản có vấn đề về hai tác phẩm kinh điển loại thực thể giả định được gọi FooBar, tôi sẽ trình bày chi tiết dưới đây.

Quy tắc kinh doanh

Dưới đây là một vài câu lệnh sẽ giúp tôi tạo ra một mô hình logic:

  • A Foo is either one Bar or one C
  • A Foo is categorized by one FooType
  • A Bar is either one A or one C
  • A Bar is classified by one BarType

Mô hình logic

Và sau đó, mô hình logic IDEF1X [1] kết quả được hiển thị trong Hình 1 (và bạn có thể tải xuống từ Dropbox dưới dạng PDF ):

Hình 1 - Mô hình dữ liệu về mối quan hệ siêu kiểu giả định

Bổ sung Foo và Bar

Tôi đã không thêm FooBar để làm cho mô hình đẹp hơn, nhưng để làm cho nó biểu cảm hơn. Tôi cho rằng chúng quan trọng do những điều sau đây:

  • Như ABchia sẻ thuộc tính được đặt tên E, tính năng này gợi ý rằng chúng là các loại thuộc tính của một loại khái niệm , sự kiện , con người , đo lường , v.v., mà tôi đại diện bằng phương tiện của Barloại siêu thực, lần lượt, là một kiểu thuộc tính Foo, giữ Dthuộc tính ở đầu phân cấp.

  • Kể từ khi Cchỉ chia sẻ một thuộc tính với phần còn lại của các loại thực thể được thảo luận, ví dụ D, khía cạnh này ám chỉ rằng nó là một loại subentity của một loại khái niệm , sự kiện , người , đo lường , vv, do đó tôi mô tả trường hợp này nhờ loại Foosiêu thực thể.

Tuy nhiên, đây chỉ là giả định và vì cơ sở dữ liệu quan hệ có nghĩa là phản ánh chính xác ngữ nghĩa của bối cảnh kinh doanh nhất định , bạn phải xác định và phân loại tất cả những điều quan tâm trong miền cụ thể của mình để bạn có thể, chính xác hơn, nắm bắt được ý nghĩa hơn .

Các yếu tố quan trọng trong giai đoạn thiết kế

Nó khá hữu ích để nhận thức được thực tế rằng, đặt tất cả các thuật ngữ sang một bên, một cụm siêu kiểu phụ độc quyền là một mối quan hệ bình thường. Hãy để chúng tôi mô tả tình huống theo cách sau:

  • Mỗi lần xuất hiện loại siêu độc quyền chỉ liên quan đến một bổ sung loại phụ .

Do đó, có một sự tương ứng (hoặc cardinality) của một đối một (1: 1) trong những trường hợp này.

Như bạn đã biết từ các bài viết trước của bạn, thuộc tính phân biệt đối xử (cột, khi được triển khai) đóng vai trò tối quan trọng khi tạo liên kết có tính chất này, bởi vì nó chỉ ra thể hiện của kiểu con chính xác mà siêu kiểu được kết nối . các di cư KHÓA CHÍNH từ (i) siêu kiểu sang (ii) các kiểu con cũng có ý nghĩa quan trọng.

Kết cấu bê tông DDL

Và sau đó tôi đã viết một cấu trúc DDL dựa trên mô hình logic được trình bày ở trên:

CREATE TABLE FooType -- Look-up table.
(
    FooTypeCode     CHAR(2)  NOT NULL,
    Description     CHAR(90) NOT NULL, 
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_FooType             PRIMARY KEY (FooTypeCode),
    CONSTRAINT AK_FooType_Description UNIQUE      (Description)
);

CREATE TABLE Foo -- Supertype
(
    FooId           INT      NOT NULL, -- This PK migrates (1) to ‘Bar’ as ‘BarId’, (2) to ‘A’ as ‘AId’, (3) to ‘B’ as ‘BId’, and (4) to ‘C’ as ‘CId’.
    FooTypeCode     CHAR(2)  NOT NULL, -- Discriminator column.
    D               INT      NOT NULL, -- Column that applies to ‘Bar’ (and therefore to ‘A’ and ‘B’) and ‘C’.
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_Foo                 PRIMARY KEY (FooId),
    CONSTRAINT FK_from_Foo_to_FooType FOREIGN KEY (FooTypeCode)
        REFERENCES FooType (FooTypeCode)
);

CREATE TABLE BarType -- Look-up table.
(
    BarTypeCode CHAR(1)  NOT NULL,  
    Description CHAR(90) NOT NULL,  
    CONSTRAINT PK_BarType             PRIMARY KEY (BarTypeCode),
    CONSTRAINT AK_BarType_Description UNIQUE      (Description)
);

CREATE TABLE Bar -- Subtype of ‘Foo’.
(
    BarId       INT     NOT NULL, -- PK and FK.
    BarTypeCode CHAR(1) NOT NULL, -- Discriminator column. 
    E           INT     NOT NULL, -- Column that applies to ‘A’ and ‘B’.
    CONSTRAINT PK_Bar             PRIMARY KEY (BarId),
    CONSTRAINT FK_from_Bar_to_Foo FOREIGN KEY (BarId)
        REFERENCES Foo (FooId),
    CONSTRAINT FK_from_Bar_to_BarType FOREIGN KEY (BarTypeCode)
        REFERENCES BarType (BarTypeCode)    
);

CREATE TABLE A -- Subtype of ‘Bar’.
(
    AId INT NOT NULL, -- PK and FK.
    X   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_A             PRIMARY KEY (AId),
    CONSTRAINT FK_from_A_to_Bar FOREIGN KEY (AId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE B -- (1) Subtype of ‘Bar’ and (2) supertype of ‘A’ and ‘B’.
(
    BId INT NOT NULL, -- PK and FK.
    Y   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_B             PRIMARY KEY (BId),
    CONSTRAINT FK_from_B_to_Bar FOREIGN KEY (BId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE C -- Subtype of ‘Foo’.
(
    CId INT NOT NULL, -- PK and FK.
    Z   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_C             PRIMARY KEY (CId),
    CONSTRAINT FK_from_C_to_Foo FOREIGN KEY (FooId)
        REFERENCES Foo (FooId)  
);

Với cấu trúc này, bạn tránh việc lưu trữ các dấu NULL trong các bảng cơ sở (hoặc các mối quan hệ ), điều này sẽ gây ra sự mơ hồ cho cơ sở dữ liệu của bạn.

Tính toàn vẹn, nhất quán và các cân nhắc khác

Khi bạn đang triển khai cơ sở dữ liệu của mình, bạn phải đảm bảo rằng (a) mỗi hàng siêu kiểu độc quyền luôn được bổ sung bởi đối tác phụ của nó và tương ứng , đảm bảo rằng (b) hàng phụ kiểu đó tương thích với giá trị có trong cột phân biệt siêu phân loại . Do đó, việc sử dụng ACID khá thuận tiệnTRANSACTIONS để đảm bảo rằng các điều kiện này được đáp ứng trong cơ sở dữ liệu của bạn.

Bạn không nên từ bỏ tính hợp lý, tự thể hiện và độ chính xác của cơ sở dữ liệu của bạn, đây là những khía cạnh quyết định làm cho cơ sở dữ liệu của bạn vững chắc hơn.

Hai câu trả lời được đăng trước đó đã bao gồm các điểm thích hợp chắc chắn có giá trị khi thiết kế, tạo và quản lý cơ sở dữ liệu của bạn và (các) chương trình ứng dụng của nó.

Lấy dữ liệu bằng cách định nghĩa XEM

Bạn có thể thiết lập một số chế độ xem kết hợp các cột của các nhóm siêu kiểu phụ khác nhau , để bạn có thể truy xuất dữ liệu trong tay mà không cần, ví dụ, viết các mệnh đề THAM GIA cần thiết mỗi lần. Bằng cách này, bạn có thể CHỌN trực tiếp TỪ VIEW ( mối quan hệ hoặc bảng có nguồn gốc ) một cách dễ dàng.

Như bạn có thể thấy, chắc chắn, Ted Ted Codd là một thiên tài. Các công cụ mà anh ấy để lại khá mạnh mẽ và thanh lịch, và tất nhiên, được tích hợp tốt với nhau.

Tài nguyên liên quan

Nếu bạn muốn phân tích một số cơ sở dữ liệu rộng lớn liên quan đến các mối quan hệ siêu kiểu phụ, bạn sẽ tìm thấy giá trị các câu trả lời phi thường được đề xuất bởi @PerformanceDBA cho các câu hỏi Stack Overflow sau:


chú thích

1. Định nghĩa tích hợp cho mô hình hóa thông tin ( IDEF1X ) là một kỹ thuật mô hình hóa dữ liệu rất được khuyến khích, được thành lập như một tiêu chuẩn vào tháng 12 năm 1993 bởi Viện Tiêu chuẩn và Công nghệ Hoa Kỳ ( NIST ). Nó hoàn toàn dựa trên (a) các tài liệu lý thuyết ban đầu được tác giả bởi Tiến sĩ EF Codd; trên (b) các Entity-Mối quan hệ quan điểm của dữ liệu, phát triển bởi Tiến sĩ PP Chen ; và cũng trên (c) Kỹ thuật thiết kế cơ sở dữ liệu logic, được tạo bởi Robert G. Brown. Điều đáng chú ý là IDEF1X đã được chính thức hóa bằng cách logic thứ nhất.


Chủ nhân của tôi đã thay đổi logic kinh doanh, loại bỏ Ehoàn toàn! Lý do chấp nhận câu trả lời của người dùng srutzky là vì nó cung cấp những điểm tốt giúp tôi đưa ra quyết định chọn tuyến đường hiệu quả nhất. Nếu không vì điều đó tôi sẽ chấp nhận câu trả lời của bạn. Tôi đã nâng cao câu trả lời của bạn trước đó. Cảm ơn một lần nữa!
Luôn luôn học tập MớiStuff
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.