【发布时间】:2017-02-23 07:42:47
【问题描述】:
考虑到我有以下3个属性:
WeatherCondition
- rainy
- sunny
- cloudy
Daytime
- day
- night
RoadType
- city
- highway
- underconstruction
我想用索引映射这个值(白天 - 1,夜晚 - 2 等)
我的问题是,考虑到任何时候我都想为属性添加 2-3 个选项,甚至是新属性,我应该怎么做?
解决方案1:
AttributessTable:
ID AttributeType AttributeValue
AT1 WeatherCondition rainy
AT2 WeatherCondition sunny
AT3 Daytime day
AT4 Daytime night
AT5 WeatherCondition cloudy
解决方案2: 每个属性的单独表格只有 2 列(ID 和值)。带有值的 WeatherCondition 表(1,下雨;2,晴;3,多云) 带值的白天表(1,白天;2,夜晚)
我对第二种解决方案有些不情愿,认为我可能必须创建 30 个表。
最终的结果是,我想要一个“查找”或“桥接”表,其 ID FK 来自另一个表,如下所示:
FinalConditions
ID Attribute
1 AT1
1 AT3
1 AT5
2 AT2
2 AT5
此外,对我来说,通过将所有这些数据全部合并来创建报告很重要,我认为使用解决方案 2 将更难合并全部 30 个表。
【问题讨论】:
-
明确建议:解决方案 2。设计良好的数据库由 许多表组成。 30 个表不是很多...我目前的项目包括 ~1000 个表...
-
我通过为每个属性设置一个表来实现,只保存一个 ID 作为主键,一个 Value 作为字符串。我的问题是,现在这个表没有链接到任何其他表,这是一个问题吗?我的意思是我使用它们将我的值映射到 EAV 表中。
-
这太棒了...如果您以后需要其他列,您可以添加它们(分组键的种类,每个项目的成本...)使用公共表,这样以后的增强功能非常有限...
-
我唯一的想法是我是否应该在这些表中添加 AttributeID 的另一列并将它们链接到 Attribute 表 (AttributeID,AttributeValue) (用于保存主题可以保存的所有属性)或离开像这样
-
我不太明白...您可以使用 MCVE (How to create a MCVE) 开始一个新问题。一般来说:如果您通过 FK 列在映射表中存储
m:n关系,则这不是EAV概念。EAV意味着存储一个表名、一个属性名和一个值(都作为字符串)。在大多数情况下,结果真的非常糟糕……
标签: sql database relationships