1

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

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

我有两种方式:

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

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

4

1 回答 1

1

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

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

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

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

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

现在,您说要存储addresses. Anaddress不是原始类型,因为它通常由名字、姓氏、街道、邮政编码、城市以及取决于您所在位置的一些附加信息组成。

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

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”)。第一种方法是不可能的,因为您无法区分整个(第二个)地址是可选的还是只有名字是可选的。

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

Well - yes, until your customer comes back and needs to store three :-)

于 2012-12-19T07:12:14.770 回答