【问题标题】:SQL Mapping values of attributes with indexesSQL 使用索引映射属性值
【发布时间】: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


【解决方案1】:

我认为这一切都归结为可伸缩性 - 表预计要容纳多少行(所有这些行,加起来)。如果它们永远不会超过 10k,您不必担心 - 解决方案 1 可以。

但是,如果您期望最终的数字是数百万行,那么解决方案 2 绝对是可行的方法 - 它会导致更少的锁,并且可能会更容易维护(尽管实施起来更困难——您可能必须“创建 30 个表”)。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多