我的表中有一列可以在一条记录中存储一个值或两个值。
例如,我有一个用户表,他们可以存储一个或两个地址。注意,它们不能存储两个以上的地址,这是限制。
我心中有两种方式:
1- Set two column in my table for two value.
2- Create another table for 2nd value.
我需要帮助才能找到最好的方法。
答案 0 :(得分:1)
1-在我的表中设置两列为两个值。 2-为第二个值创建另一个表。
这取决于您的实际数据。首先,您应该对database design principles和normalization有基本的了解。规范化主要是为了节省空间并有助于确保数据的一致性。
对于您的具体问题:您说您有两个values
,并且该记录可以存储其中一个或两个。
让我们假设该值是一个基本类型,如INT
。在这种情况下,我会选择一个有两列的表:
CREATE TABLE dataTable (
first INT NOT NULL,
second INT
);
此表可以存储一个数字(first
)和一个可选的second
个数字。我省略了一个主键,实际上你应该添加。
现在,您说要存储addresses
。 address
不是原始类型,因为它通常由名字,姓氏,街道,邮政编码,城市组成,并根据您的位置提供一些其他信息。
同样,直接的方法是简单地创建一个包含两组这些数据的表:
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”)。第一种方法是不可能的,因为你无法区分整个(第二)地址是可选的,或者只有第一个名称是可选的。
注意他们不能存储两个以上的地址,这是限制。
嗯 - 是的,直到您的客户回来并需要存储三个: - )