Sql server SQL Server:定义州与州之间关系(边界)的适当方式是什么?

Sql server SQL Server:定义州与州之间关系(边界)的适当方式是什么?,sql-server,tsql,entity-framework,database-design,Sql Server,Tsql,Entity Framework,Database Design,假设您必须构建一个DB表来描述状态及其彼此之间的边界。假设States表如下所示: 状态:名称(主键)、大小等 界定国家间关系(边界)的适当方式是什么 我想出了三个选择- 定义主键由两个字段组合的边框表:Id(PK)、StateName(PK、FK) 使用StateName1(主键,FK)、StateName2(主键,FK)定义边框表 使用两个州名称的连接值定义边界表 更多信息: 我将按如下方式查询数据:someState.HasBorderWith(State anotherState) 我

假设您必须构建一个DB表来描述状态及其彼此之间的边界。假设States表如下所示:

状态:名称(主键)、大小等

界定国家间关系(边界)的适当方式是什么

我想出了三个选择-

  • 定义主键由两个字段组合的边框表:Id(PK)、StateName(PK、FK)
  • 使用StateName1(主键,FK)、StateName2(主键,FK)定义边框表
  • 使用两个州名称的连接值定义边界表
  • 更多信息:

    • 我将按如下方式查询数据:
      someState.HasBorderWith(State anotherState)
    • 我将EF4.0与POCO实体一起使用

    选项2是这种关系的标准实现。我不明白你所说的选项1是什么意思,选项3也不是一个选项——质疑这一点将是一场噩梦

    选项2是这种关系的标准实现。我不明白你所说的选项1是什么意思,选项3也不是一个选项——质疑这一点将是一场噩梦

    就我个人而言,我会创建一个包含以下内容的表:

     Id (PK)
     StateName1 (FK)
     StateName2 (FK)
    

    这基本上是您的第二个选项,带有一个附加的Id字段(这不是必需的,但在实践中几乎每个表上都使用Id字段)。

    我个人会创建一个包含以下内容的表:

     Id (PK)
     StateName1 (FK)
     StateName2 (FK)
    


    这基本上是您的第二个选项,带有一个附加的Id字段(这不是必需的,但在实践中几乎每个表上都使用Id字段).

    在我的第一个选项中,我的意思是每个边界有两个条目,而两个条目都有相同的边界id。+1:我们应该轮流用尺子拍Aaron的手,以提及选项3…@Aaron-这将允许单个边界有少于或多于两个关联的状态-鉴于您的要求,这是错误的#2是最好的方法-但我会考虑在桌子上有一个单独的PK,正如安得烈在下面建议的(我不是说我会有这个,但是我会肯定的)。这提醒了我——如果我搞砸了,我十多年前的驾驶教练会用尺子打我的手——真是太容易造成事故了,傻女人!在我的第一个选项中,我的意思是每个边界有两个条目,而两个条目都有相同的边界id。+1:我们应该轮流用尺子拍打Aaron的手,以提及选项#3…@Aaron-这将允许单个边界有少于或多于两个关联的状态-鉴于您的要求,这是错误的#2是最好的方法-但我会考虑在桌子上有一个单独的PK,正如安得烈在下面建议的(我不是说我会有这个,但是我会肯定的)。这提醒了我——如果我搞砸了,我十多年前的驾驶教练会用尺子打我的手——真是太容易造成事故了,傻女人!您需要对状态1和状态2的值使用唯一的约束/索引,否则该表将允许重复。单独的主键列只有在您打算使用它时才有价值-我在
    someState.HasBorderWith中看不到它的用途(…
    。但我知道ORM倾向于喜欢这种表设置。我不会在链接表上使用单独的代理键…ORM尾巴不应该摇动数据库狗…我们不这样做是因为ORM的原因,我们这样做主要是因为它使外键非常明显。外键总是被命名为_id,这使得编写/理解更容易这要容易得多(至少根据我们的经验)。关于重复项-我们只需在状态1/2列上添加一个唯一的约束。@gbn:为什么ORM是尾巴,数据库是狗?这两个工具都有一个目的:支持创建它们的业务功能。如果我的ORM意味着我可以更快、更准确地完成这项工作,并且ap具有更大的灵活性应用程序,然后无论如何让ORM狗摇动数据库的尾巴!:-)@Marjan Venema:前面已经提到过,bit ORM出错时也会有负面影响……您可能希望对状态1和2的值使用唯一的约束/索引,否则该表将允许重复。只有在您打算使用它时,单独的主键列才有价值-我看不到在
    someState.HasBorderWith中的用法(…
    。但我知道ORM倾向于喜欢这种表设置。我不会在链接表上使用单独的代理键…ORM尾巴不应该摇动数据库狗…我们不这样做是因为ORM的原因,我们这样做主要是因为它使外键非常明显。外键总是被命名为_id,这使得编写/理解更容易这要容易得多(至少根据我们的经验)。关于重复项-我们只需在状态1/2列上添加一个唯一的约束。@gbn:为什么ORM是尾巴,数据库是狗?这两个工具都有一个目的:支持创建它们的业务功能。如果我的ORM意味着我可以更快、更准确地完成这项工作,并且ap具有更大的灵活性应用程序,然后无论如何让ORM狗摇动数据库的尾巴!:-)@Marjan Venema:这在前面已经提到过,位ORM出错时也有负面影响。。。