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

标签 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

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/

相关文章:

java - 从 postgres 检索 json 查询并在 java 中显示

sql unique 和对插入设置约束

php - 创建表时出错 : Key column doesn't exist

ruby-on-rails - ActiveRecord 与 SQL 原始查询?

ruby-on-rails - 什么是 Searchlogic 的可行替代品?

ruby-on-rails - Postgres查询查找数据库是否为只读模式

Java PreparedStatement 和 ON DUPLICATE KEY UPDATE : how do I know whether row was inserted or updated?

mysql - 如何指定 "NOW()"在 mysql 查询中引用 24 小时制(而不是 12 小时制)?

mysql - 不同的项目和计数分组不同的项目?

mysql - 显示另一个表中不存在的数据