数据库表设计方法

时间:2017-07-28 19:06:09

标签: sql sql-server database-design

我对正确的桌面设计有疑问。想象一下情况:

表格中有两个实体(公司和演员)。 演员可以有几种类型(即商店,PoS,个人等)

  • 实体之间的关系是多对多的,因为一个Actor可以分配给多个公司,反之亦然(一个公司可以有多个Actors)
  • 为了概述这种关系,我可以创建一个名为“C2A”的链接表。所以,我们最终会得到这样的结构:

    |公司1 | Actor1(店铺)

    |公司1 | Actor2(POS)

    |公司2 | Actor1(POS)

  • 这种方法在需求变更之前就可以正常工作。现在我们需要有可能将Actor分配给Actor来构建另一种层次结构,即一个Actor(Shop)可能有多个其他Actors(PoS)分配给它,而所有这些都属于某个公司。所以,我们最终会得到这样的结构:

    |公司1 |演员1(商店)| NULL

    | NULL |演员1(商店)| Actor1(POS)

    | NULL |演员1(商店)| Actor2(POS)

我需要能够表达关系(公司(C)和演员(A)之间),如下所示:C - A - A; A - C - A; A - A - C

在一个表中有两个相似的字段并不是最好的主意。这种关系通常如何设计?

1 个答案:

答案 0 :(得分:2)

为实体Company和Actors创建两个单独的表。

Company( Id (PK), Name)
Actor(Id (PK), Name)

现在,如果你确定很多人。您可以继续为此创建单独的表。

CompanyActorMap( MapId (PK), CompanyId (FK), ActorId (FK))

对于演员Heirarchy,使用单独的表,因为它与层次结构与公司的关系无关,它与Actors如何相互关联。多级无限层次结构的最佳方法是创建一个新表,其中两列用于作为外键的Actor Id

ActorHierarchy( HierarchyId (PK), ChildActorId (FK), ParentActorId(FK))

对于层次结构中没有父级的Actor,在CompanyActorMap表中可以有一个表示层次结构头的条目,并且可以通过检查PArentActorId列及其childActorId从ActorHierarchy表派生剩余的链。

这显然是草稿。希望这可以帮助。