gpt4 book ai didi

mysql - 与两个实体共享地址表是一个好习惯吗?

转载 作者:行者123 更新时间:2023-11-29 11:18:02 24 4
gpt4 key购买 nike

我的数据库中有两个实体都需要地址。两者的每个 ID 都可以有一个地址。

地点表:

create_table "venues", force: :cascade do |t|
t.string "name"
t.text "description"
t.string "email"
t.string "phone"
t.integer "category_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

用户表

create_table "users", force: :cascade do |t|
t.string "first_name"
t.string "surname"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

field 地址表有两列对于用户来说是不必要的。纬度和经度列。

在这种情况下,创建一个带有用户外键的地址表和带有 field 外键的其他地址表是一个好方法吗?最好的解决方案是什么?

最佳答案

这是针对实体的一般答案,其中实体的某些子集具有额外属性。因此,它可能适合也可能不适合您的特定应用程序,但很可能值得评估。

将所有地址放在一张表中。这几乎毫无异常(exception)是最佳实践。创建一个单独的表来保存坐标。由于这是1-1的关系,因此该表的PK也是它们所绑定(bind)的地址的FK。

create table Coords(
AddrID int not null primary key
references Addresses( ID ),
Latitude CoordType not null,
Longitude CoordType not null
);

我要添加的内容将为应用程序开发人员带来一些便利。在“用户和场所”表前面添加 View ,这些 View 公开表数据并附加了地址数据。

create view UsersWithAddr as
select u.f1, u.f2, ..., a.f1, a.f2,...
from Users u
join Addresses a
on a.ID = u.AddrID;


create view VenuesWithAddr as
select v.f1, v.f2, ..., a.f1, a.f2,..., c.Latitude, c.Longitude
from Users u
join Addresses a
on a.ID = u.AddrID
join Coords c
on c.AddrID = a.ID;

因此,当应用程序与用户一起使用时,地址数据不存在会被设置为 NULL 的虚假坐标字段。当应用程序与场馆合作时,地址与坐标数据一起存在,而应用程序不必担心如何维护该数据。

现在您的表已完全标准化(假设它们在没有地址数据的情况下标准化),您不必担心包含 NULL 的不需要的字段,并且应用程序将以它们期望看到的形式看到地址数据,具体取决于它们是否正在寻找用户或场所。

关于mysql - 与两个实体共享地址表是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39427779/

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