Eclipse EXTO模式和SQL数据库是否需要具有相同的外键?

Eclipse EXTO模式和SQL数据库是否需要具有相同的外键?,eclipse,phoenix-framework,Eclipse,Phoenix Framework,当我使用references关键字来生成模式时,我注意到在实际数据库中,对应的列没有将该列作为外键列出 例如,假设我们(在控制台中)呼叫: mix phx.gen.html多媒体视频用户\u id:references:users\ url:字符串标题:字符串描述:文本 这将在pgsql中生成一个如下所示的表: 请注意,user_id在列名中没有[FK]。从属性上看,也没有外键 我的问题是:是否有必要让EXTO模式和sql数据库指示相同的外键?在Phoenix中,我们在视频模式中使用属于:us

当我使用
references
关键字来生成模式时,我注意到在实际数据库中,对应的列没有将该列作为外键列出

例如,假设我们(在控制台中)呼叫:
mix phx.gen.html多媒体视频用户\u id:references:users\
url:字符串标题:字符串描述:文本

这将在pgsql中生成一个如下所示的表:

请注意,user_id在列名中没有[FK]。从属性上看,也没有外键

我的问题是:是否有必要让EXTO模式和sql数据库指示相同的外键?在Phoenix中,我们在视频模式中使用
属于:user,Rumbl.Accounts.user
来表示外键。但是查看数据库,你无法真正推断出这一点。

TL;DR 严格来说,没有必要在数据库级别定义关系。即使数据库不知道表是相关的,并且没有定义外键索引和约束,Ecto关联也会起作用

话虽如此,在数据库级别正确定义的关系有许多好处,例如引用完整性、更好的性能,以及在对数据应用更改时增加的可用功能。因此,尽管可以跳过这些,但不建议这样做

下面是一些关于您看到的数据库对象的说明。下面是您提到的命令生成的迁移和模式

mix phx.gen.html多媒体视频用户\ id:参考:用户url:字符串标题:字符串描述:文本

您可以从命令行postgres客户端
psql
获取此输出。其他(GUI)客户机可能支持也可能不支持您需要了解的关于数据库的所有信息,因此最好使用@KonstantinStrukov这一权威工具集。

TL;DR 严格来说,没有必要在数据库级别定义关系。即使数据库不知道表是相关的,并且没有定义外键索引和约束,Ecto关联也会起作用

话虽如此,在数据库级别正确定义的关系有许多好处,例如引用完整性、更好的性能,以及在对数据应用更改时增加的可用功能。因此,尽管可以跳过这些,但不建议这样做

下面是一些关于您看到的数据库对象的说明。下面是您提到的命令生成的迁移和模式

mix phx.gen.html多媒体视频用户\ id:参考:用户url:字符串标题:字符串描述:文本


您可以从命令行postgres客户端
psql
获取此输出。其他(GUI)客户机可能支持也可能不支持您需要了解的关于数据库的所有信息,因此最好使用@KonstantinStrukov作为最终工具集。

当您转换
mix phx.gen时。
is不会生成任何表。使用
mix-exto.migrate
运行迁移时会生成表。因此,这里的真实来源不是CLI命令,而是1)模式迁移和2)PG表规范(不是一些可视化表示,而是
\d
的输出)。你能同时提供吗?我不知道如何显示1和2<代码>\d在控制台上不起作用。此外,这个问题更多的是一个理论问题。因为模式将
用户id
视为外键,所以一切正常。在通过pgsq4查看实际的sql db时,它没有显式编写。当您强制转换
mix phx.gen.
is时,它不会生成任何表。使用
mix-exto.migrate
运行迁移时会生成表。因此,这里的真实来源不是CLI命令,而是1)模式迁移和2)PG表规范(不是一些可视化表示,而是
\d
的输出)。你能同时提供吗?我不知道如何显示1和2<代码>\d在控制台上不起作用。此外,这个问题更多的是一个理论问题。因为模式将
用户id
视为外键,所以一切正常。当通过pgsq4查看实际的sql db时,它只是没有显式编写。

  # in priv/repo/migrations/<timestamp>_create_videos.exs

  def change do
    create table(:videos) do
      add :url, :string
      add :title, :string
      add :description, :text
      add :user_id, references(:users, on_delete: :nothing)

      timestamps()
    end

    create index(:videos, [:user_id])
  end

  # in lib/app/multimedia/video.ex

  schema "videos" do
    field :description, :string
    field :title, :string
    field :url, :string
    field :user_id, :id

    timestamps()
  end

shell> psql -h localhost -U postgres -d db_name
psql> \d videos

# output
                                         Table "public.videos"
   Column    |              Type              | Collation | Nullable |              Default
-------------+--------------------------------+-----------+----------+------------------------------------
 id          | bigint                         |           | not null | nextval('videos_id_seq'::regclass)
 url         | character varying(255)         |           |          |
 title       | character varying(255)         |           |          |
 description | text                           |           |          |
 user_id     | bigint                         |           |          |
 inserted_at | timestamp(0) without time zone |           | not null |
 updated_at  | timestamp(0) without time zone |           | not null |
Indexes:
    "videos_pkey" PRIMARY KEY, btree (id)
    "videos_user_id_index" btree (user_id)
Foreign-key constraints:
    "videos_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)