哪个是存储一列有1个值或2个值的最佳方法?

时间:2012-12-19 06:54:36

标签: mysql database

我的表中有一列可以在一条记录中存储一个值或两个值。

例如,我有一个用户表,他们可以存储一个或两个地址。注意,它们不能存储两个以上的地址,这是限制。

我心中有两种方式:

1- Set two column in my table for two value.
2- Create another table for 2nd value.

我需要帮助才能找到最好的方法。

1 个答案:

答案 0 :(得分:1)

  

1-在我的表中设置两列为两个值。 2-为第二个值创建另一个表。

这取决于您的实际数据。首先,您应该对database design principlesnormalization有基本的了解。规范化主要是为了节省空间并有助于确保数据的一致性。

对于您的具体问题:您说您有两个values,并且该记录可以存储其中一个或两个。 让我们假设该值是一个基本类型,如INT。在这种情况下,我会选择一个有两列的表:

CREATE TABLE dataTable (
    first INT NOT NULL,
    second INT
);

此表可以存储一个数字(first)和一个可选的second个数字。我省略了一个主键,实际上你应该添加。

现在,您说要存储addressesaddress不是原始类型,因为它通常由名字,姓氏,街道,邮政编码,城市组成,并根据您的位置提供一些其他信息。

同样,直接的方法是简单地创建一个包含两组这些数据的表:

CREATE TABLE dataTable (
    firstName VARCHAR(40),
    lastName VARCHAR(40),
    street VARCHAR(40),
    zipCode INT,
    firstName2 VARCHAR(40),
    lastName2 VARCHAR(40),
    street2 VARCHAR(40),
    zipCode2 INT
);

然而,这种方法不灵活,也可能浪费空间。在这种情况下,我将分离(“规范化”)模式并使用两个表:

CREATE TABLE address (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    firstName VARCHAR(40),
    lastName VARCHAR(40),
    street VARCHAR(40),
    zipCode INT
);

CREATE TABLE dataTable (
    first INT NOT NULL,
    second INT,
    FOREIGN KEY (first) REFERENCES address(id),
    FOREIGN KEY (second) REFERENCES address(id)
);

使用此方法,您可以在数据表中存储(“引用”)一个或两个地址。当然,缺点是您需要在创建新记录时将数据插入到两个表中,并且需要在查询中正确连接表。但是,它允许您例如添加其他约束,例如定义名字是可选的,但姓氏是必填项(“NOT NULL”)。第一种方法是不可能的,因为你无法区分整个(第二)地址是可选的,或者只有第一个名称是可选的。

  

注意他们不能存储两个以上的地址,这是限制。

嗯 - 是的,直到您的客户回来并需要存储三个: - )