【问题标题】:SQL Data storageSQL 数据存储
【发布时间】:2015-02-28 01:53:17
【问题描述】:

我有存储数据的 MySQL 数据库:

 标识 |价值 |
 1 @值1
         @值2
         @值3
_________@value4__
 2 @值5
         @值6
_________@value7__
 3 @值8
         @value9 

如果我需要从特定的“id”中提取“值”,我会继续下一步:

  • 选择我需要的“id”行
  • 使用 php 函数 explode("@",$value) 对存储在特定“id”中的值进行剪切,并从中创建一个数组。

所以我的问题是,以这种方式工作和存储数据是否有效?也许我应该改变存储方式(如下所示)并仅使用 SQL 查询来检索数据。

你会推荐什么?

 标识 |价值 |
 1 @值1
 1 @值2
 1 @值3
_1_______@value4__
 2 @值5
 2 @值6
_2_______@value7__
 3 @值8
 3 @value9 

【问题讨论】:

  • RELATIONAL 数据库中的表是基于 PRIMARY KEY 构建的。他们是建立关系的东西。如果您没有 PRIMARY KEY,那么您就没有表。

标签: php mysql


【解决方案1】:

将您的架构更改为:

id | group | value
======================
1  | 1     | "Value 1"
2  | 1     | "Value 2"
3  | 1     | "Value 3"
4  | 2     | "Value 4"
5  | 2     | "Value 5"
6  | 3     | "Value 6"
7  | 3     | "Value 7"
8  | 3     | "Value 8"
...

这样每一行都有一个唯一的 ID,如果您发现自己处于需要指向特定行的情况下,这将非常有用,并且值将使用标识符(在本例中为数字)进行分组。

现在您可以轻松选择属于某个组的所有值:

SELECT `value` FROM `tableName` WHERE `group` = 2

这将为您提供表格的这个子集:

id | group | value
======================
4  | 2     | "Value 4"
5  | 2     | "Value 5"

创建表的SQL是:

DROP TABLE IF EXISTS `tableName`;

CREATE TABLE `tableName` (
    `id`    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `group` INT NOT NULL,
    `value` VARCHAR(256) NOT NULL
);

您还应该阅读relational model 是什么以及它是如何工作的。知道如何normalize your database 是一个相关主题,了解它很有用。

【讨论】:

  • 是的,这就是我的想法,但为什么这种存储方式比我现在使用的更好?
  • 更好,因为数据应该只是数据。将数据存储为需要操作才能使用的字符串,这违背了使用数据库的目的。如果您想了解关系数据库的工作原理,您应该阅读relational model。这是一个巨大的话题,我无法在这里解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2013-09-08
  • 2017-10-11
  • 2011-08-12
相关资源
最近更新 更多