2010-01-08 78 views
0

我正在为特许经营者设计一个数据库。我的技术水平最好(我只是在特许经营者办公室工作)。该数据库必须定义商店位置和特许经营商。所以我知道我需要一个“商店”桌子和一个“特许经营者”桌子。 “商店编号”将是商店表中的主要关键字。一个加盟商可以拥有多家商店。我想我可以在加盟商表格中指定一个“加盟商ID”作为主要关键字,以便让加盟商加盟店面。这是我的问题:每家商店可以由多达4家加盟商拥有。所以我被困在如何定义所有这些。我不确定我可以做多个加盟商的ID,即使我可以,经常只有1或2人拥有的商店。这意味着许多空白字段。另外,当我需要查询时,我不确定它将如何聚集在一起。任何建议最合乎逻辑的方式来做到这一点?定义表格/主键

+0

由于@Joelio声明你需要什么被称为连接/连接表。您实际上拥有的是商店和特许经营之间的多对多关系。 4个特许经营商的限制是你需要在另一个层面处理的事情。 – David 2010-01-08 19:19:47

回答

0

好的,所以对于商店来说,你已经有了一个有效的主键 - StoreNumber。所以,你“商店”表会像

Store  StoreNumber INTEGER PRIMARY KEY 
      StoreName STRING 
      ...... 

然后你有另一台加盟商将举行加盟商和他们的信息 - 主键将是FranchiseeID

Franchisee FranchiseeID INTEGER PRIMARY KEY 
      FranchiseeName STRING 
      (other fields) 

要加入这两个,因为你可以比单一的业主多,您需要一个店主的表,这样的事情:

StoreOwner StoreNumber INTEGER FOREIGN KEY to "Store" 
       FranchiseeID INTEGER FOREIGN KEY to "Franchisee" 

这两个领域的结合(StoreNumber, FranchiseeID)将是你的StoreOwner中的主键。

这样,您可以拥有给定商店的任意数量的所有者。

3

您需要一个连接表,创建一个名为franchisee_store并带有2个id字段的表,其中1个将是商店的ID,另一个将是特许经营商的ID。

here是一个很好的例子。

0

你需要的是一个多对多的连接表。这是以第三范式完成此操作的正确方法。

例子:

franchisees: 
    farnchisee_id 
    other stuff 
stores: 
    store_id 
    other stuff 
franchisee_stores: 
    frachisee_id 
    store_id 

这是从来没有向一般属性阵列添加到表中,因为可以用加入表更好地处理一个好主意。正如您已经指出的,在您的商店表中有四家加盟商会浪费空间,而这些商店的空间会更少,更重要的是,这会限制任意拥有商店的加盟商的数量。

0

我想知道如果任何人有任何想法如何在Jet/ACE数据存储中执行“每店4加盟店”规则。当然,A2010增加了新的表级数据宏,它们可以像触发器一样工作,允许您为连接表定义一个数据宏,以强制执行该业务规则。

但是在A2010之前,没有引擎级别的方法来执行此操作 - 您必须将某些逻辑放在应用程序本身中。

我在想这样做的一种方法是将第三列添加到您的连接表,这是一个特许经营人编号。作为PK的一部分,它将是必需的,并且如果你把一个验证规则就像“1和4之间”一样。这不会自动增加,所以你必须在代码中处理它,但它会阻止添加不符合规则的记录。

有没有人有任何其他方法来解决这部分问题的建议?我很想听听有没有办法用缺少触发器和多记录表级约束的表进行建模。尽管如此,它必须在Jet/ACE中工作才能在这里生存。