定义哪些属性属于给定数据库表中特定类型的好方法是什么?

时间:2016-06-21 15:45:03

标签: c# .net sql-server

在即将推出的.Net基于网络的应用程序中,我们将有多种位置类型,例如酒店,餐厅,机场,所有这些都存储在SQL Server数据库表中。

我想为所有位置使用一个Locations表,但是某些属性与特定的位置类型相关联。这样,在编辑酒店房产时,我们不希望看到像机场代码这样的属性。

我认为所有属性都应该列为列,然后在某些配置类中定义哪些属性属于LocationType。我不确定这是否可行,想要一些建议,甚至是如何实现这一点。

4 个答案:

答案 0 :(得分:1)

  

编辑酒店属性时,我们不希望看到类似的属性   机场代码

这是应用程序的事情。如果共享位置,则需要在应用程序级别对其进行管理。

在数据库中,您只有Airport表,其中FK到Location表。可以只是一个简单连接的机场(和其他类型)的视图。

在位置表中,您可以有一个类型列,但不是。

一个潜在的问题是位置可能存在于酒店和机场。如果你想在数据库级别保护它,那么有点过头了。您可以拥有一个复合PK,其中type是一个组件。然后在类型表中,该值被限制为该值。但是你有增加PK其他组件的问题。我不认为Identity喜欢成为复合键的一部分。我想你可以有每种类型的序列。

看起来像这样

Location  
TypeID     PK FK (to a simple valid types table)  
LocationID PK  

Airport 
TypeID     PK  (hard coded to that TypeID)  
LocationID PK  
FK to Location  

在应用程序中,每个Type都实现了Location。

如果您想在机场附近找到酒店,那么单个位置表是必不可少的。

答案 1 :(得分:1)

规范化你的表格。

enter image description here

位置数据将存储在位置表中。需要机场代码的地点将在AirportCode表中保留相应的记录。

答案 2 :(得分:0)

有一些标准模式:TPT,TPH,TPC。我假设您使用的是ORM。不同的ORM支持不同的模式。 EF确实支持一些。您可以在.NET端使用继承,只显示相关属性。

这是一个相当大的话题。你需要研究它。权衡取舍并非无足轻重。

你可以考虑选择最简单的TPH 解决方案,而不用继承,只是放弃你的目标。

答案 3 :(得分:0)

您可以使用包含所有列的Locations表,然后使用顶部的视图来限制为不同位置类型返回的列。