gpt4 book ai didi

mysql - 将数据放入表 OneToONE 的正确方法

转载 作者:行者123 更新时间:2023-11-30 01:14:26 26 4
gpt4 key购买 nike

当存在一对一关系时,我对将数据放入数据库表中的正确/最有效的方法感到困惑。

例如,我有一个用户表。

我现在希望每个用户都能够说出他当前所在的国家/地区位置。

然后我希望能够按当前位置在数据表中搜索用户。

我这样做的方法是创建 3 个单独的表。即

表一 - 用户:仅包含用户信息:

CREATE TABLE users(
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(30) NOT NULL,
lastName VARCHAR(40) NOT NULL,
);

表二国家/地区列表:国家/地区列表以及每个国家/地区各自的 ID

PHP Code:
CREATE TABLE countrylist(
country_id MEDIUMINT UNSIGNED NOT NULL,
country VARCHAR(60) NOT NULL,
INDEX country_id ( country_id, country ),
INDEX countrylist (country, country_id ),
UNIQUE KEY (country)

);

表 3;包含他居住的userId和countryId:

PHP Code:
CREATE TABLE user_countrylocation(
country_id VARCHAR(60) NOT NULL,
id MEDIUMINT UNSIGNED NOT NULL,
INDEX country_id (country_id, id ),
INDEX user_id (id, country_id )
);

或者,我应该将countryId放入用户表中并完全删除user_countrylocation。即在每个用户列中,我将为其居住的国家/地区放置一个country_id。

问题是我有 20 多个与上面类似的表,其中提供了用户的详细信息;即使用的语言、年龄组、国籍等。

我担心的是,如果我将这个唯一信息放在用户表中的每个用户列中,那么搜索数据库的最有效方法是什么:这就是我选择上面样式的原因。

所以,我真的请求一些关于规划数据库的最有效/正确方法的建议。

最佳答案

如果您将拥有大量数据,那么您应该保持相同的方法并使用以下方法来满足一对一约束

如果您没有大量数据,那么您应该保留国家/地区等查找表,并在列中使用用户的引用。但是您可能需要允许它们为空,这使得此类可选信息列可以为空。

最有效、最正确的方法是先删除第三个表“user_countrylocation”中的数据,以便更新用户。然后插入用户的新位置。不要忘记使用事务。

你的表 3 应该有

country_id MEDIUMINT UNSIGNED NOT NULL,

而不是

country_id VARCHAR(60) NOT NULL,

并将所有表中的列名从 id 更改为 user_id。

如果您使用存储过程,它会像

create procedure sp_UpdateUserCurrentCountry (
@userID MEDIUMINT UNSIGNED,
@CountryID MEDIUMINT UNSIGNED)

begin
as
delete from user_countrylocation
where user_id = @userID

insert into user_countrylocation
(
country_id,
user_id
)
values
(
@CountryID,
@userID
)
END

关于mysql - 将数据放入表 OneToONE 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19198853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com