【问题标题】:MySQL Create pivot table from existing column in existing tableMySQL从现有表中的现有列创建数据透视表
【发布时间】:2013-06-15 08:48:20
【问题描述】:

我有一个包含各种客户信息的预先存在的表。目前它还具有以字符串形式列在 3 列中的“城市”以及“地区”和“州”。冗余信息!

我想创建三个新表,一个用于城市,一个用于区域,一个用于州,其中将包含每个城市的单个条目等,然后将 ID 引用回现有客户带有 location_id 的表。

如何将不同的城市名称导出到城市表中,将不同的区域导出到区域表中,然后让城市也引用 region_id 和 state_id 表,以便将信息全部分组!

当然是业余问题,但我感谢任何帮助!

【问题讨论】:

  • 这很容易通过一些基本的 SQL 查询来实现。您是否尝试过开始这项工作并遇到了具体问题?
  • 另外,在这种情况下,我可能会质疑这种标准化水平的必要性。如果您只打算在应用程序中将城市视为一个不同的对象,并且地区和州只是该对象的属性,那么我只会将城市拉出到它自己的表中,并将州和地区作为字段。当然,如果您将状态和区域视为第一类对象实体(即区域和状态将具有不同的属性),则将它们标准化。
  • 嘿,谢谢伙计。是的,我只是……今天脑死亡太可怕了。我需要对区域级别进行规范化,因为那里也会包含不同的信息。我预计州一级也是如此,所以我想这比抱歉更安全?
  • 当然,如果州和地区真的有自己的属性和与之关联的业务逻辑,那么一定要规范化。我刚刚提出了这一点,因为正如最初描述的那样,这些似乎只是额外的数据字段,只是所选城市的结果。您经常看到人们“规范化”这样的事情,最终只会使应用程序变得更加复杂,尤其是在您使用某种 ORM 时。
  • 所以分解问题。第一步是从表中提取所有城市、州、地区数据。你打算怎么做?

标签: mysql


【解决方案1】:

您不想要三个不同的表!您想要一个包含三列的表:citystateregion

原因是city 本身并不存在。考虑(在美国)伊利诺伊州斯普林菲尔德。和马萨诸塞州斯普林菲尔德。或佛罗里达州迈阿密和俄亥俄州迈阿密。您所拥有的是具有层次结构的数据维度。存储此信息的正确方法是在最低级别(在您的情况下为城市),使用“维度”表提供其他信息。

假设你的原始数据是正确的,你可以这样做:

create table Cities (
    CityId int auto_increment not null primary key,
    City varchar(255),
    State varchar(255),
    Region varchar(255)
);

insert into Cities(City, State, Region)
    select distinct City, State, Region
    from YourTable;

我意识到这不是“标准范式”。但是对于大多数应用程序来说,这很有效。例如,如果您要为要从列表中选择状态的应用程序执行此操作,请在状态上创建索引,这样查询会很快。

在某些情况下,您可能需要在州和地区级别使用单独的表。如果您在这些级别上有很多不同的列,就会出现这种情况。并且,特别是,如果您要修改这些列中的值。当数据是静态的(城市不经常改变状态)时,扁平维度(如此处所述)最合适。当您在不同级别更改值时,标准化最合适。

【讨论】:

  • 从最初的问题描述中,我的想法与您的想法完全相同——标准化在这里会是多余的。如果您查看后续的 cmets,至少在区域级别似乎有合理的归一化理由。
  • 但是,如果我要定期更改区域信息中包含的信息,那么将该列也规范化到它自己的表中会很聪明,对吗?
  • @Decalmo 。 . .是的。在这种情况下,更新的需要将为该信息提出一种更规范化的方法。但是,城市和州不应该分开。
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 2021-06-10
  • 2022-06-16
  • 1970-01-01
  • 2012-04-16
  • 2020-10-23
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多