如何选择数据库结构?

时间:2016-06-06 20:15:28

标签: database postgresql database-design

我有两个实体存储,项目。项目存储在存储中。物品有不同的类型。例如,Item类型是Resources,Weapon。武器具有独特的物品实例特征"损坏"。

资源没有任何唯一的实例特征,可以通过增加计数来堆叠到另一个现有实例。

我有多种方式来做到这一点:

  1. 将所有内容保存在一个表中:storage_items(id,item_id,count,damaged)并在item_id上创建部分索引,条件为COUNT IS NOT NULL

  2. 按类型将其分为两个表格(storage_resourcesstorage_weapons

  3. 创建两个表storage_items(storage_items_id,item_id,count)和items_properties(id,storage_items_id,已损坏)。

1 个答案:

答案 0 :(得分:1)

将不同的子类型链接到公用表的一种方法是使用类型代码来区分链接。例如:

create table Storage(
    ID       serial,
    ItemType char( 1 ) not null,
    ..., -- Fields common to all items
    constraint CK_StorageType check ItemType in( 'R', 'W' ),
    primary key( ID, ItemType )
);

ID字段本身就是唯一的,因此您可能需要或者只想让它自己拥有PK。你可以改为:

create table Storage(
    ID       serial,
    ItemType char( 1 ),
    ..., -- Fields common to all items
    constraint CK_StorageType check ItemType in( 'R', 'W' ),
    primary key( ID ),
    constraint UQ_IdItem unique( ID, ItemType )
);

无论哪种方式,为每种类型的项目创建一个单独的表:

create table ResourceItems(
    ID       int not null,
    ItemType char( 1 ) not null,
    ..., -- Fields unique to Resource items
    constraint ResourceItemType check( ItemType = 'R' ),
    primary key( ID, ItemType ),
    constraint FK_ResourceItem_Storage( ID, ItemType )
        references Storage( ID, ItemType )
);

create table WeaponItems(
    ID       int not null,
    ItemType char( 1 ) not null,
    ..., -- Fields unique to Weapon items
    constraint WeaponItemType check( ItemType = 'W' ),
    primary key( ID, ItemType ),
    constraint FK_WeaponItem_Storage( ID, ItemType )
        references Storage( ID, ItemType )
);

因此,您必须将所有存储条目指定为R或W类型。所有资源条目必须在存储中具有定义为R的条目,并且所有Weapon条目必须具有定义为W的存储条目。这允许您具有不同类型的项目,同时保持它们牢固隔离,从而保持数据完整性。