与两个实体共享地址表是一种好的做法吗?

时间:2016-09-10 15:47:23

标签: mysql ruby-on-rails database database-design polymorphic-associations

我的数据库中有两个实体都需要地址。两者每个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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

PopUpViewController

我要添加的内容对应用程序开发人员来说会有点方便。在“用户和场地”表的前面,其中包含使用附加的地址数据公开表数据的视图。

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

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

现在你的表已完全规范化(假设它们在没有地址数据的情况下被标准化),你不必担心包含NULL的不需要的字段,应用程序将看到他们期望看到的表单中的地址数据如果他们正在看用户或场所。

相关问题