有效地将变量值存储在数据库中

时间:2014-06-09 06:52:52

标签: mysql sql data-structures

我目前正在处理类似于此处链接的数据结构:

http://sqlfiddle.com/#!2/2ad8f/1

将会有一个字段(在这种情况下是水果)可以包含非常多变的选项 - 数量,颜色,类型等。我正在尝试找出一种有效的方式来存储这些数据并在前端以编程方式使用它。

我考虑过创建新字段(例如数量字段,颜色字段等),但数据可以高度变化,我将处理许多行。可能1-2百万。我不想创造一个"纹理"例如,仅用于100 / 1,000,000行的字段。

"水果"这里永远不会被数据库存储引擎排序或引用。

到目前为止,我最好的想法是将JSON对象存储为字符串(请参阅链接中的第二个插入内容),但是有更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

如果要将所有属性放在一个文本容器中,也可以使用文本文件而不是关系数据库。数据库将有很多开销,你根本就没有使用,为什么要这样做呢?

如果您想以关系形式使用它,那么让我们进行一些简单的建模。

我们有不同种类的水果。这些水果可以具有不同甚至不同种类的属性。这是一个简单的方法:

create table Fruit(
    ID int auto_increment primary key,
    Name varchar( 20 ) not null,    -- Apple, Orange, etc.
    Type varchar( 20 ),    -- Macintosh, Granny Smith, Navel, etc.
    Size char( 1 ),        -- S, M, L
    Qty int not null,
    -- other data such as price, shelflife, whatever
);

现在我们为每种不同的属性创建一个表:

create table Attr(
    ID int auto_increment primary key,
    Type varchar( 20 ),    -- Color, Texture, Taste, etc.
    Value varchar( 10 )   -- Red, Green, Juicy, Sweet, Sour, etc.
);

每个水果都可以有多个属性,每个属性可以应用于多种水果,所以你需要它们之间有多对多的交叉表:

create table FruitAttr(
    FruitID int,
    AttrID int,
    primary key( FruitID, AttrID )
);

FruitID是Fruit的一个外键,AttrID是Attr的外键。现在我们可以创建一个篮子表来定义每个篮子。

create table Basket(
    ID int auto_increment primary key,
    Name varchar( 20 ) not null,    -- Graduation, Funeral, Birthday, etc.
    Price decimal (19,4),
    -- other basket-specific attributes
);

篮子由几种水果选择组成,每种水果都可以出现在几种篮子中。因此,在Fruit和Fruit之间,Fruit和Attr之间存在着相同的关系:多对多。由于我们已经对其中一个表格进行了建模,我将把它留给您。

可以进行增强和更改以使这些表更贴近您的特定用途,但我们现在有了可行的解决方案。

所以很快我们就从一张桌子变成了五张桌子。这可能看起来像我们已经复杂化了一切,但如果你必须使用它们,你会发现我们已经使我们(意为你的)的生活变得更加轻松,特别是当你添加新的类型时篮子或水果,改变一个篮子的构成,替换一个水果(严重的核心腐烂突然使格兰尼史密斯不可用),或任何方式,你需要改变你的数据。

毕竟,它是一个关系数据库,并且在表之间建立关系,而不是在字符串中的子串之间建立关系。因此,使用这些关系的DML和查询将比尝试操作文本字符串更容易