我对数据库很陌生。我有一个我应该做的项目,基本上是在恢复该数据库,这是一个很大的麻烦。错误的命名约定,未标准化等。
我尝试将PK分配给一个字段,但是我不能,因为访问引发了一个错误,说值是重复的。
我应该将这张桌子放进1NF,然后从那里移到3NF。
此表中的一个字段称为“ WarehouseID”和“ CustomerID”
问题是项目希望我保持一些数据不变,例如WarehouseID和customerID,并且WarehouseID多次使用多次。
示例:
仓库编号
WH1
WH1
WH2
WH2
WH2
客户ID
1
2
3
3
4
5
5
该表已经在1NF中,但是我无法将PK分配给“ WarehouseID”字段,因为它具有多个值。
即使我试图将该表设为2NF,我也无法在单独的表中创建PK,因为我仍然会得到以下结果
仓库编号
3
3
4
4
5
5
8
我不太确定该怎么办。
答案 0 :(得分:0)
请记住,对于给定的表,PK只会发生一次。
每个表都应该有一个PK,并且不会在其他任何表中用作PK。
因此,您可能有一个名为Warehouse的表。
它可以具有WarehoueID的PK
您可能有一个名为Customer的表,并且它可能有一个名为CustomerID的PK。
下一步: 如果您总是将一个客户分配到给定的仓库,则只需在客户表中添加一个称为WarehouseID的列。但是,此列不是PK。它是“ plane jane”长号列。此列肯定会允许重复。
您在这里唯一真正的问题是客户可以拥有或使用多个仓库?
您可以为给定客户分配多个仓库吗?
那么,您只需要创建客户可以使用的仓库表或“列表”即可。
如果是上述情况,则需要一个名为:
的表CustomerListOfWareHouses。
上表只是给定客户正在使用的仓库的“列表”。如果这是您想要的,那么客户表中根本就不需要WarehouseID。
你有
tblCustomes
--->tblCustomerListOfWareHouses
因此,我们将tblcustomerListOfWareHouses称为子表。
在该表中,您将拥有一个PK(ListOfWareHousesID),然后可以设置该记录的归属者(customerID),然后设置他们正在使用的仓库(WareHouseID)。
这样仓库的“清单”看起来像这样:
ListOfWareHousesID (PK)
CustomerID (plane jane long number colum)
WarehouseID (plane jane long number colum)
Date of Enter (date column, when created)
Who Authorized (person that approved use of warehouse).
“and perhaps a few ore columns if you want or need).
然后是仓库的第三张桌子。在这种设置中,您实际上从来不会将仓库附加到给定的客户,而只是拥有一个可以“列出”该客户正在使用的仓库的表。
这将假设每个客户可以使用并拥有“许多”仓库。
因此,您永远不会真正将仓库附加到客户。您真正要做的就是在客户正在使用的仓库表(tblCustomerListOfWareHouses)中“列出”。
因此,这意味着客户表和仓库表永远不会相互连接,并且客户和仓库之间没有任何强制关系。
您的数据模型将“允许”您将“许多”仓库附加到一个客户,但实际上,您要做的就是通过将记录添加到“仓库列表”中来“列出”客户拥有的仓库。客户正在使用(tblCustoerListOfWareHouses)。
当然,如果客户只能使用一个仓库吗?那么,只需在表客户中添加一个名为WareHouseID的列,然后只需在该客户中输入“ id”值即可将该客户附加到一个仓库中。 (因此您不需要“仓库清单”,因为只允许使用一个仓库)。
如前所述,只有客户可以使用并且拥有多个仓库的情况下,才需要仓库的“清单”。
因此,每个仓库记录都会有一个PK,每个客户也会有一个PK。但是,目前还没有任何建议可以重复。
如果客户只能使用一个仓库,则将该简单列添加到保存该仓库的客户表中。那就是一个简简飞机专栏–许多客户可以使用同一仓库,并且该专栏肯定会允许重复。
答案 1 :(得分:0)
添加一个自动编号字段-然后将其指定为PK。
很明显,任何重复的字段都不能是PK字段-因此,您需要采用某种方式来处理它。一个想法是用该字段的DISTINCT列表创建一个新表。然后将此新表作为主表,将现有表作为子表。只是个临时想法-可能不适合您的情况。
我建议所有活动事务表仅使用自动编号字段的PK字段-尽管并非所有人都同意这种设计理念。仅静态列表表(即状态列表)适用于非自动编号的PK字段。