与两个实体共享地址 Table 是一种好习惯吗?

Is it a good practice sharing Address Table with Two Entities?

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

场地Table:

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

用户table

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

场馆地址table有两栏用户不需要。纬度和经度列。

在这种情况下,创建一个带有用户外键的地址 table 和另一个带有场地外键的地址 table 是否是一个好方法?最好的解决方案是什么?

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

将所有地址集中在一个 table。这几乎是无一例外的最佳实践。创建一个单独的 table 来保存坐标。由于这是一对一的关系,因此 table 的 PK 也是它们绑定到的地址的 FK。

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

我要添加的内容会为应用程序开发人员带来一些便利。在用户和地点 table 前面显示带有附加地址数据的 table 数据的视图。

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 的虚假坐标字段。当应用程序与场地一起使用时,地址和坐标数据就在那里,应用程序不必担心如何维护这些数据。

现在您的 table 已完全规范化(假设它们在没有地址数据的情况下已规范化),您不必担心不需要的字段包含 NULL,应用程序将在表单中看到地址数据他们希望看到的取决于他们是在看用户还是在看场地。