【问题标题】:Is it possible to add extra columns to fields in mysql?是否可以在 mysql 中的字段中添加额外的列?
【发布时间】:2013-11-07 18:59:47
【问题描述】:

我们希望通过向每个“列”添加额外的列来扩展 MySQL。现在你有以下内容。

Field, Type, Null, Key, Default, Extra

我们希望能够在“列”定义中添加一个额外的列,例如Attributes。我们的系统有一定的设计规范,我们需要每“列”描述更多的数据。我们如何在 MySQL 中做到这一点?

返回所有列的查询如下。

SHOW COLUMNS FROM MyDB.MyTable;

编辑 1

我应该一开始就添加这个,我很抱歉没有这样做。我们目前在 Comments 部分中为每种列类型描述属性,我们知道这是一个非常肮脏的解决方案,但它是我们当时唯一能想到的解决方案。我们已经构建了一个围绕 DB 结构的代码生成器,这正是这一举措的真正根源。我们希望描述列的代码属性,以便代码生成器可以获取更改并在每次更改或运行时刷新代码库。

【问题讨论】:

  • 向表中添加额外的字段,不要破坏mysql本身。 “field”、“field_foo”、“field_bar”等...
  • MySQL 没有字段。它有列和表。世界字段通常用作列的同义词。不清楚你需要在这里做什么。
  • @MarcB 我们想为表中的每一列分配属性。为“field”添加“field_foo”会为每一行一遍又一遍地重复相同的数据。
  • 您是在谈论能够添加有关列本身的元数据(即,每列一个元数据条目,而不管表中的行数如何),或者您是否希望在每条记录都包含额外的列该列的值?
  • @MikeBrant 希望为每列添加元数据,而不管行数

标签: mysql database-design database-schema


【解决方案1】:

首先,术语:“字段”和“列”在这种情况下基本上是同义词。字段和列之间没有区别。一些 MySQL 命令甚至允许您互换使用这两个词(例如 SHOW FIELDS FROM MyDB.MyTable)。

我们想为表中的每一列分配属性。为“field”添加“field_foo”会为每一行一遍又一遍地重复相同的数据。

简单回答: 如果您想要更多与给定列foo 相关的属性,那么您应该创建另一个表,其中foo 是它的主键,因此每个不同的值都恰好是一行。这是database normalization 进程的一部分。这允许您使用属性来描述foo 的给定值,而无需重复数据,即使您在原始表中多次使用该值也是如此。


听起来您可能还需要允许可扩展性,并且您希望在未来某个时间允许新列,但您现在不知道哪些列或多少列。这是一个很常见的项目需求。

您可能会对我的演示文稿Extensible Data Modeling 感兴趣,我在其中概述了针对此类问题的 SQL 的不同解决方案。

  • 额外的列
  • 实体-属性-值
  • 类表继承
  • 序列化的 LOB
  • 倒排索引
  • 在线架构更改
  • 非关系型数据库

这些解决方案都不是万无一失的,每个都有其优点和缺点。因此,值得了解所有这些,然后确定哪些具有对您的特定项目很重要的优势,而它们的弱点不会给您带来太多不便(这是许多软件设计选择的决策过程)。


我们目前正在评论部分中描述每种列类型的属性

所以您使用的是“序列化 LOB”解决方案。

【讨论】:

  • 网站上的实体属性值在哪里?这听起来像是我们想要做的。
  • @meanbunny,在考虑使用 EAV 之前,请阅读这篇文章:Bad CaRMa
  • 我们最初确实为与对象相关的额外属性创建了另一个表,但在真实对象的情况下,我们希望使数据库结构尽可能简单。因此寻求可能扩展 MySQL。我将阅读您现在发布的文章。
  • @meanbunny,数据库规范化在某种程度上更简单。它会为您要添加字段的每个属性生成一个额外的表,但它减少了您也说过要避免的信息的冗余存储,因此消除了数据异常的可能性。
  • @BillKarwin - 非常感谢您的幻灯片。我不知道倒排索引是解决与序列化 LOB 相关的一些缺点的一种方式。最好的问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2019-04-15
  • 2012-10-05
相关资源
最近更新 更多