How to model a one-mandatory-of-many relationship

I have following class model that I’m quite happy with:

Class Model

A Whole has a special mandatory Part. Furthermore it has a collection of parts, that contains at least the mandatory part, but may contain many more. In the OO model parts don’t need to know where they belong.

So now I came up with this RDB model:

Whole:
   id - primary key
   special_part_id - non-nullable, unique, foreign key to Part

Part:
   id - primary key
   whole_id - non-nullable, foreign key to Whole

The only constraint that is not checked here is Whole = Whole.special_mandatory_part.whole.

However, with this table layout I’m not even able to insert rows. Might be worth mentioning that I’m using an ORM, but even with plain SQL I would not know how to do it.

So my questions are:

  • Is this DB design bad, and if so why?
  • If not, how would you insert rows?
  • What design would you recommend and why?

I’m aware of this very similar question. However, because of the not null constraint my problem is slightly different (worse I’d say) and I’m not satisfied with the given answers.

UPDATE Just found an answer on how to insert rows with a table layout like this.

First the evident errors:

  • special_part_id in Whole shouldn’t exist
  • whole_id in Part should be a FK to Whole, not to user

That way the relationships is that Whole is comprised of one or more parts.

Now to clarify something:

  • Conceptually you can model a one-to-many relationship that is mandatory both ways, but physically it’s imposible to implement. You can only implement it being mandatory on one side and not-mandatory in the other. In this case, it’s mandatory on the Part side, but optional on the Whole side.

8

Stop trying to model business rules in your database, it is a time sink that will get you no where. It is also distracting you from modeling these rules where it is appropriate to do so, your business object layer.

Databases have one job only, and that is to persist your application’s state.

Please do not take this to mean that basic referential integrity checks are not a good idea; they are. But, when it comes to the minutia, like X must have one Y, that is the role of your application.

It might be more flexible to add a IsPartRequired (bit) column to your part table and let the application do the enforcement. It might also be possible that you are trying to put something in the DB which does not need to be there at all.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa

How to model a one-mandatory-of-many relationship

I have following class model that I’m quite happy with:

Class Model

A Whole has a special mandatory Part. Furthermore it has a collection of parts, that contains at least the mandatory part, but may contain many more. In the OO model parts don’t need to know where they belong.

So now I came up with this RDB model:

Whole:
   id - primary key
   special_part_id - non-nullable, unique, foreign key to Part

Part:
   id - primary key
   whole_id - non-nullable, foreign key to Whole

The only constraint that is not checked here is Whole = Whole.special_mandatory_part.whole.

However, with this table layout I’m not even able to insert rows. Might be worth mentioning that I’m using an ORM, but even with plain SQL I would not know how to do it.

So my questions are:

  • Is this DB design bad, and if so why?
  • If not, how would you insert rows?
  • What design would you recommend and why?

I’m aware of this very similar question. However, because of the not null constraint my problem is slightly different (worse I’d say) and I’m not satisfied with the given answers.

UPDATE Just found an answer on how to insert rows with a table layout like this.

First the evident errors:

  • special_part_id in Whole shouldn’t exist
  • whole_id in Part should be a FK to Whole, not to user

That way the relationships is that Whole is comprised of one or more parts.

Now to clarify something:

  • Conceptually you can model a one-to-many relationship that is mandatory both ways, but physically it’s imposible to implement. You can only implement it being mandatory on one side and not-mandatory in the other. In this case, it’s mandatory on the Part side, but optional on the Whole side.

8

Stop trying to model business rules in your database, it is a time sink that will get you no where. It is also distracting you from modeling these rules where it is appropriate to do so, your business object layer.

Databases have one job only, and that is to persist your application’s state.

Please do not take this to mean that basic referential integrity checks are not a good idea; they are. But, when it comes to the minutia, like X must have one Y, that is the role of your application.

It might be more flexible to add a IsPartRequired (bit) column to your part table and let the application do the enforcement. It might also be possible that you are trying to put something in the DB which does not need to be there at all.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật