0

说我想规范化一个表

itemID | itemDate | itemSource | type | color | size | material
 254    03/08/1988    toyCo      doll   null     16    plastic
 255    03/08/1988    toyCo      car    blue     null  plastic
 256    03/08/1988    toyCo      boat   purple   20    wood

现在类型字段只能有 3 个值中的 1 个。doll, car, or boat. 的属性color, size, and material在功能上依赖于type。正如您所看到的,项目type|doll不确定color。我不知道这是否是一个问题。但继续前进。

type(pk) | color | size | material= 表 A

itemID(pk) | itemDate | itemSource= 表 B

我们现在处于 1nf。我的问题是type键及其属性是否可以基于类型键的可能值?

typeDoll(pk) | size | material= 表 C

typeCar(pk) | color| material= 表 D

typeBoat(pk) | color | size | material表 E

4

2 回答 2

2

我不确定我是否完全理解您的要求,但这是在 SQL 中创建独占弧的一种方法。

-- Columns common to all types.
create table items (
  item_id integer primary key,
  item_type varchar(10) not null
    check (item_type in 'doll', 'car', 'boat'),

  -- This constraint lets the pair of columns be the target of a foreign key reference.
  unique (item_id, item_type),

  item_date date not null default current_date,
  item_source varchar(25) not null
);

-- Columns unique to dolls. I'd assume that "size" means one thing when you're
-- talking about dolls, and something slightly different when you're talking
-- about boats.
create table dolls (
  item_id integer primary key,
  item_type varchar(10) not null default 'doll'
    check(item_type = 'doll'),
  foreign key (item_id, item_type) references items (item_id, item_type),
  doll_size integer not null 
    check(doll_size between 1 and 20),
  doll_material varchar(25) not null  -- In production, probably references a table 
                                      -- of valid doll materials.
);

列 dolls.item_type 连同它的 CHECK 约束和外键引用,保证

  • “娃娃”中的每一行在“项目”中都有一个匹配的行,并且
  • 那个匹配的行也是关于娃娃的。(不是关于船或汽车。)

船和汽车的桌子是相似的。

如果必须在 MySQL 中实现这一点,则必须替换 CHECK 约束,因为 MySQL 不强制执行 CHECK 约束。在某些情况下,您可以将它们替换为对小表的外键引用。在其他情况下,您可能必须编写触发器。

于 2013-04-29T13:54:52.173 回答
0

我想要实现的目标是Polymorphic Association。这可以通过创建一个超级表来存储所有可能的列并使用第二个和第三个表将外键限制为主键来实现。

它在这里详细解释

于 2013-04-29T03:16:38.843 回答