在我正在设计的数据库中,有一个相当中心的表代表已售出或待售的物品。它区分个人销售(如 eBay)和正规公司的销售。这意味着实际上有 1 个或两个字段并不同样适用于两种情况......例如,一个字段仅在一种情况下使用,另一个字段在一种情况下是可选的,但在另一种情况下是强制性的。
如果有更多专业知识,那么明智的做法是拥有一个核心表,然后使用两个包含与特定案例相关的字段的表。但在这里,创建两个表只是为了包含一个字段加上对核心表的引用,这看起来既不美观,又让查询设计者和数据库软件感到痛苦。
你怎么认为?是否可以通过使用弱化约束的单个表来稍微改变规则 - 这意味着数据库不能 100% 防止添加不一致的数据(以非常有限的方式) - 或者我应该接受它并创建看起来愚蠢的 1 字段桌子?
您使用一张用于公共列的表和用于特定于子类型的列的从属表来描述的内容称为类表继承 http://martinfowler.com/eaaCatalog/classTableInheritance.html。这是一件非常好的事情。
@Scott Ferguson 似乎描述的内容(两种不同的销售类型的两个不同的表)被称为具体表继承 http://martinfowler.com/eaaCatalog/concreteTableInheritance.html。根据您的需求,它也可能是一个很好的解决方案,但更常见的是,它只会使跨两种子类型编写查询变得更加困难。
如果您需要的只是仅适用于给定子类型的一两列,我同意创建依赖表似乎有点矫枉过正。请记住,大多数品牌的 SQL 数据库都支持CHECK
约束或触发器,因此您可以将数据完整性规则设计到元数据中。
CREATE TABLE Sales (
sale_id SERIAL,
is_business INT NOT NULL, -- 1 for corporate, 0 for personal
sku VARCHAR(20), -- only for corporate
paypal_id VARCHAR(20), -- mandatory but only for personal
CONSTRAINT CHECK (is_business = 0 AND paypal_id IS NOT NULL)
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)