6

朋友们,

我有一个奇怪的需求,无法思考解决问题的方法。由于关键字回收(如您所见),伟大而强大的 Google 几乎没有帮助。你能帮我吗?

我想要做的是将多种类型的数据存储在 MySQL 的单个列中。

这是一个相当于 C 联合的数据库(如果你搜索 MySQL 和联合,你显然会在 SQL 中的 UNION 关键字上得到一大堆东西)。

[以下是人为和简化的案例]所以,让我们说我们有一些人 - 有名字 - 和 STORMTROOPERS - 有 TK 号码。您不能同时拥有姓名和 TK 号码。你要么是 BOB SMITH,要么是 TK409。

在 CI 中可以将其表示为一个联合,如下所示:

union {
        char * name;
        int tkNo;
      } EmperialPersonnelRecord;

这使得我要么存储指向字符数组的指针,要么存储类型为 EmperialPersonnelRecord 的 ID,但不能同时存储两者。

我正在寻找列上的 MySQL 等效项。我的专栏将存储 int、double 或 varchar(255)(或任何组合)。但只会占用最大元素的空间。

这可能吗?

(当然,只要有足够的时间、金钱和意愿,一切皆有可能——我的意思是,如果我很穷、很懒并且在最后期限内……也就是“开箱即用”,这是否可能)

4

4 回答 4

4

正如 a1ex07 所说,您可以通过存储字符串表示来做到这一点。但是,如果您担心空间问题,将实际值存储在几个 NULLable 列中可能会节省更多空间。

或者,创建辅助表并规范化,例如

你想要的:

表格1
|id|name_or_TK#|

你可以这样做:

表格1
|id|名称|TK|

或者你可以做

表格1
|id|ST_or_human_flag|人类和冲锋队共有的其他列

表 2 - Names_of_humans
|id|姓名|

表 3 - TKs_of_STs
|id|TK|
于 2010-03-16T21:07:31.613 回答
1

不,没有“联合”列类型。但是您可以创建一个足够大的列来容纳最大的元素和另一个用作类型指示器的列。IE

... data VARCHAR(15), data_type enum('int','double','char')...
于 2010-03-16T20:58:58.527 回答
1

C 联合是处理这个问题的一种相当复杂的方法。

你有一个多态数据类型。因此,解决问题的一种方法是切换到面向对象的数据库,或者是动态类型的数据库,例如一些“NoSQL”数据库。

如果您必须使用当前的关系数据库,您可以做标准的事情,即构建某种 ORM(对象关系映射器)来进行翻译。一种方法是将公共(“基类”)字段与类型列一起放在主表中,然后使用类型列选择哪个“叶类”表包含附加字段。例如:

table Employee
    field id int
    field emp_type enum('human', 'stormtrooper')
    field salary int
    field division_id int
    field manager_id int

table HumanEmployee
    field emp_id int
    field name string

table StormtrooperEmployee
    field emp_id int
    field tk_number int

也就是说,*Employee 表通过员工 ID 绑定回基本 Employee 表。

于 2010-03-16T21:14:11.030 回答
0

我认为您应该有 2 个不同的列并相应地存储数据,检索时您可以将它们强制转换并将它们附加在一起,例如 col1 + col2 as full_name

于 2010-03-16T21:16:21.273 回答