gpt4 book ai didi

ruby-on-rails - 整数、索引列、外键、引用之间的差异和最佳实践

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

在 Rails 中有多种方法可以将模型和表格链接在一起。

add_column :books, :user_id, :integer, index: true
add_reference :books, :user, index: true, foreign_key: true

据我所知,我看到一些数据库在这个选项方面有不同的行为。

我有兴趣找到最佳实践来提高性能和代码可读性。

我很长一段时间都在使用整数索引列,我想知道我是否应该使用带有 foreign_keys 的引用。

更新:例子

在我运行的全新测试应用中:

 rails g model book author_id:integer:index user:references

迁移文件如下所示:

class CreateBooks < ActiveRecord::Migration
def change
create_table :books do |t|
t.integer :author_id
t.references :user, index: true, foreign_key: true

t.timestamps null: false
end
add_index :books, :author_id
end
end

表的ddl

-- 表:public.books

-- DROP TABLE public.books;

CREATE TABLE public.books
(
id integer NOT NULL DEFAULT nextval('books_id_seq'::regclass),
author_id integer,
user_id integer,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
CONSTRAINT books_pkey PRIMARY KEY (id),
CONSTRAINT fk_rails_bc582ddd02 FOREIGN KEY (user_id)
REFERENCES public.users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.books
OWNER TO my_user_name;

-- Index: public.index_books_on_author_id

-- DROP INDEX public.index_books_on_author_id;

CREATE INDEX index_books_on_author_id
ON public.books
USING btree
(author_id);

-- Index: public.index_books_on_user_id

-- DROP INDEX public.index_books_on_user_id;

CREATE INDEX index_books_on_user_id
ON public.books
USING btree
(user_id);

编辑 2:这是一个描述问题并指出外键重要性的链接

Link

最佳答案

稍微扩展一下我的评论:是的,外键的主要功能是保持参照完整性(https://en.wikipedia.org/wiki/Referential_integrity)。

附带的好处是,它们提供了一些关于您的架构的更明确的信息:查询和设计工具可以利用这些关系,而不是依赖于共享的列名。

检查外键引用的所有列是否已建立索引也很容易,否则您可能只会在查询时发现缺失的索引。

http://www.postgresql.org/docs/current/static/ddl-constraints.html#DDL-CONSTRAINTS-FK

性能影响很容易推断:每当子表中的数据发生变化(插入/删除/更新)时,您将对父表进行索引查找。对于大多数中小型表,您永远不必担心。

关于ruby-on-rails - 整数、索引列、外键、引用之间的差异和最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269694/

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