在即将推出的.Net基于网络的应用程序中,我们将有多种位置类型,例如酒店,餐厅,机场,所有这些都存储在SQL Server数据库表中。
我想为所有位置使用一个Locations
表,但是某些属性与特定的位置类型相关联。这样,在编辑酒店房产时,我们不希望看到像机场代码这样的属性。
我认为所有属性都应该列为列,然后在某些配置类中定义哪些属性属于LocationType
。我不确定这是否可行,想要一些建议,甚至是如何实现这一点。
答案 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)
答案 2 :(得分:0)
有一些标准模式:TPT,TPH,TPC。我假设您使用的是ORM。不同的ORM支持不同的模式。 EF确实支持一些。您可以在.NET端使用继承,只显示相关属性。
这是一个相当大的话题。你需要研究它。权衡取舍并非无足轻重。
你可以考虑选择最简单的TPH 解决方案,而不用继承,只是放弃你的目标。
答案 3 :(得分:0)
您可以使用包含所有列的Locations表,然后使用顶部的视图来限制为不同位置类型返回的列。