库存数据库设计

时间:2014-06-25 20:48:54

标签: sql sql-server database database-design

我有2个表用户公司。 这两个都有库存。

数据表

物品

ItemId | Name
================
   1   | Glass
   4   | Wood

用户

UId | Name
============
 1  | Max

公司

 CId  | Name
==================
  1   | EvilCorp

广告

 RowId  |   UId  |   CId  |  ItemId  |  amount 
=================================================
   1    |   2    |   Null |    4     |   10 
   2    |   23   |   Null |    4     |   5 
   3    |   Null |   1    |    1     |   7
   4    |   Null |   1    |    4     |   70

假设我有500个用户和300个公司,每个人都有20个库存槽,我的库存表中有16000个空值(6000 UId nulls + 10000 CId nulls)。

我想要一个会说出这些信息的SQL查询。

结果

Owner     | Item  | Amount
===========================
 MAX      | Wood  | 10
 EvilCorp | Glass | 7
 EvilCorp | Wood  | 40

我的问题是我的广告资源表是错误的,因为当记录是针对用户时,将针对CId显示的所有空值,反之亦然。

你知道如何在没有庞大或/和复杂的SQL查询的情况下创建一个好的表吗?

1 个答案:

答案 0 :(得分:0)

您拥有用户,公司和所有者。用户和公司是业主。

这是一种常见的情况,可以通过各种方式列入表格。

每个表都包含使某些语句成立的行:

// "user [OId] has ..."
User(OId,...)
    fk OId references Owner -- a user is an owner

// "company [OId] has ..."
Company(OId,....)
    fk OId references Owner -- a company is an owner

// "Owner [OId] has ..."
Owner(OId,...)

// "[OId] owns [n] of item [itemId]"
Inventory(Oid,ItemId,amount)
    fk OId references Owner
    fk ItemId references Item

这来自于选择对应用程序部分做出简单陈述的表。对于变量,请阅读有关子类型和超类型的子表和超类。请参阅this回答或this一个。