资产数据库设计问题

Mas*_*low 1 sql schema database-design asset-management

我正在建立一个资产跟踪数据库。资产因黑莓、个人电脑、服务器、显示器、扬声器、键盘、鼠标、椅子、桌子、小隔间、立方墙、打印机、冰箱、微波炉……各种各样的东西而异。该范围将是我的类别表:

create table AssetManagement.zCategory(
   zCategoryId int identity primary key,
   CategoryDescription varchar(15) unique not null
   )
Run Code Online (Sandbox Code Playgroud)

计算机很容易有一个类别、制造商和型号,但某些资产(椅子或其他)可能只有一个型号。有些可能只有制造商。

我相信使用良好的数据库设计来强制执行以下操作是一个很好的设计:

  • 如果已知模型的制造商,
    • 不可能在数据库中的其他地方使用不同的类别或制造商存储相同的模型 ID
  • 存储在数据库中的资产必须具有类别
  • 在 3 个中的任何一个中使用 id 来描述“未知”会让人不舒服,但可能是必要的)

因此,虽然模型可能有已知的制造商,资产可能有模型或制造商,或两者都有,但它应该始终有一个类别。

到目前为止,这是我想出的,我想过使用触发器来强制执行直接外键不会

create table AssetManagement.zModel(
  zModelId int identity primary key,
  zModelDescription varchar(15) unique not null,
  zAssetCategoryId int not null references AssetManagement.zAssetCategory(zAssetCategoryId)
)


create table AssetManagement.zManufacturer(
  zManufacturerId int identity primary key,
  zManufacturerDescription varchar(15) unique not null
)

create table AssetManagement.zProduct
(
 zProductId int identity primary key,
 zProductDescription varchar(35),
 zAssetCategoryId int references AssetManagement.zAssetCategory(zAssetCategoryId),
 zModelId int references AssetManagement.zModel(zModelId),
 zManufacturerId int references  AssetManagement.zManufacturerId(zManufacturerId)

)


create table Assetmanagement.Asset(
  AssetId int identity primary key,
  Tag varchar(15),
  zProductId int not null references assetmanagement.zProduct,
  zLocationId int references assetmanagement.zLocation(zLocationId),
  EmployeeId int references assetmanagement.employee(employeeId),
  PurchasedDate datetime,
  PurchasedBy int references assetmanagement.employee(employeeId),
  DisposalDate datetime,
  Depreciated float,
 AddedBy int references assetmanagement.employee(employeeId),
 AddedDate datetime 
)
Run Code Online (Sandbox Code Playgroud)

或者错过了这条船,有一种方法可以设计这个方便的(将模型 ID、制造商 ID 和产品类型都直接放在资产表上,同时强制执行适当的唯一性?

cle*_*tus 5

我会这样做。

  • 资产(id、model_id、asset_tag、created_date);
  • 型号(id、category_id、制造商、型号、描述);
  • 类别(id,名称);
  • 人 (id, title, given_names, surname, job_title, ...);
  • 分配(id、asset_id、person_id、start_date、end_date、current_flag)。

基本上,资产是带有标签的东西。它不包含有关类别、制造商或型号的信息。如果你这样做,你就是在对数据进行非标准化。它包含模型的外键,即该信息。我认为型号和制造商只不过是自由格式的文本,但在某些情况下,您的要求可能会将其中一个或两者都变成表格。

您可以将拥有资产的人存储在资产表中,但不会以这种方式获得历史记录(尽管可以使用资产历史记录或审计表来完成)。