【问题标题】:is it a correct database design?这是一个正确的数据库设计吗?
【发布时间】:2014-04-09 05:46:08
【问题描述】:

我正在使用 EF 5、Web Api 和 MVC4 我需要有关此数据库设计的帮助。我需要在数据库中保存医院的城市和城镇,但是没有循环,医院有一个城镇,一个城市有很多城镇

public class City
{
    public int CityId { get; set; }
    public List<Town> Towns { get;  set; }
    public string Name { get; set; }
    [Timestamp]
    public byte[] RowVersion { get; set; }

    public City()
    {
        Towns = new List<Town>();
    }
}

 public class Town
{
    public int TownId { get; set; }

    public int CityId { get; set; }

    public string Name { get; set; }

    public byte[] RowVersion { get; set; }
}

 public class Hospital
{
    public int HospitalId { get; set; }

    [Required]
    public string Name { get; set; }

    public int TownId { get; set; }
    public  Town Town { get; set; }

    public int CityId { get; set; }

    public City City { get; set; }

    public bool IsAvailable { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }


    public Hospital()
    {
      this.IsAvailable = true;
    }
}

我不喜欢医院类的City属性,但我需要另一种选择,就像一个循环

【问题讨论】:

  • 这是否是正确的关系:医院位于一个且只有一个城镇,城镇可能有零个或多个医院,城镇位于一个且只有一个城市,城市有一个或多个城镇。那么,了解城镇意味着您基于这种关系了解这座城市。

标签: c# asp.net-mvc-4 ef-code-first relational-database


【解决方案1】:

“循环”有什么问题? EF一直在使用它们,双向导航非常有用!当然,它在尝试序列化时会中断,但无论如何你都不应该这样做:)。

关于您的问题,如果一个城市“有”多个城镇,并且医院在一个城镇中,那么医院就没有必要了解一个城市。它知道它在哪个城镇,从而知道它在哪个城市。当然,如果一个给定的城镇可以在多个城市中(但医院是一对独特的),那么您的设计看起来很完美。

根据您提供的信息,我将完全从 Hospital 类中删除“City”属性。如果您需要访问它,只需通过 Town 属性即可。

myHospital.Town.City

【讨论】:

  • 我正在使用 Web API,我不应该有循环
【解决方案2】:

好吧,如果每个 Town 都与一个 City 相关联,并且每个 Hospital 都与一个 Town 相关联,那么您可以使用这些关系轻松找到 Hospital 所在的 City。

您不需要将 City 作为数据库的 Hospital 表中的一列,但为简单起见,您可能仍希望将其作为代码中的属性。
在这种情况下,最简单的方法是将 Hospital 类连接到视图而不是实际的 Hospital 表。

【讨论】:

    【解决方案3】:

    如果我要编写那个应用程序,我会参加这样的课程。

    City 不包含任何关系属性:

    public class City
    {
        public int Id { get; set; }
        public string Name { get; set; }
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }
    

    Town 在任何City

    public class Town
    {
        public int Id { get; set; }
        public int CityId { get; set; }
        public string Name { get; set; }
        public byte[] RowVersion { get; set; }
    }
    

    HospitalTown 中。您可以通过TownId访问City

    public class Hospital
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public int TownId { get; set; }
    
        //you can uncomment this for less coding for searching, filtering etc..
        //public int CityId { get; set; }
    
        public bool IsAvailable { get; set; }
        [Timestamp]
        public byte[] RowVersion { get; set; }
        public Hospital()
        {
          this.IsAvailable = true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2019-06-14
      • 2011-04-25
      • 2010-09-24
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多