我的表中有一列可以在一条记录中存储一个值或两个值。
例如,我有一个用户表,他们可以存储一个或两个地址。注意,他们不能存储超过两个地址,这是限制。
我有两种方式:
1- Set two column in my table for two value.
2- Create another table for 2nd value.
我需要帮助才能找到最好的方法。
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 :-)