- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
已知:tX_1.name 永远不能为 NULL,长度可变,最多 45 个字符,并且必须始终是唯一的。
哪些因素会影响是否应使用代理 PK 加唯一列(架构 1)或 PK 自然键是否使用第一个表的唯一列作为其 PK(架构 2)?
CREATE TABLE IF NOT EXISTS t1_1 (
idt1_1 INT NOT NULL AUTO_INCREMENT,
name VARCHAR(45) NOT NULL,
data VARCHAR(45) NULL,
PRIMARY KEY (idt1_1),
UNIQUE INDEX name_UNIQUE (name ASC))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS t1_2 (
idt1_2 INT NOT NULL AUTO_INCREMENT,
t1_1_idt1_1 INT NOT NULL,
data VARCHAR(45) NULL,
PRIMARY KEY (idt1_2),
INDEX fk_t1_2_t1_1_idx (t1_1_idt1_1 ASC),
CONSTRAINT fk_t1_2_t1_1
FOREIGN KEY (t1_1_idt1_1)
REFERENCES t1_1 (idt1_1)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS t1_3 (
idt1_3 INT NOT NULL AUTO_INCREMENT,
data VARCHAR(45) NULL,
PRIMARY KEY (idt1_3))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS t1_1_has_t1_3 (
t1_1_idt1_1 INT NOT NULL,
t1_3_idt1_3 INT NOT NULL,
PRIMARY KEY (t1_1_idt1_1, t1_3_idt1_3),
INDEX fk_t1_1_has_t1_3_t1_31_idx (t1_3_idt1_3 ASC),
INDEX fk_t1_1_has_t1_3_t1_11_idx (t1_1_idt1_1 ASC),
CONSTRAINT fk_t1_1_has_t1_3_t1_11
FOREIGN KEY (t1_1_idt1_1)
REFERENCES t1_1 (idt1_1)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_t1_1_has_t1_3_t1_31
FOREIGN KEY (t1_3_idt1_3)
REFERENCES t1_3 (idt1_3)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
架构2
CREATE TABLE IF NOT EXISTS t2_1 (
name VARCHAR(45) NOT NULL,
data VARCHAR(45) NULL,
PRIMARY KEY (name))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS t2_2 (
idt2_2 INT NOT NULL AUTO_INCREMENT,
t2_1_name VARCHAR(45) NOT NULL,
data VARCHAR(45) NULL,
PRIMARY KEY (idt2_2),
INDEX fk_t2_2_t2_11_idx (t2_1_name ASC),
CONSTRAINT fk_t2_2_t2_11
FOREIGN KEY (t2_1_name)
REFERENCES t2_1 (name)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS t2_3 (
idt2_3 INT NOT NULL AUTO_INCREMENT,
data VARCHAR(45) NULL,
PRIMARY KEY (idt2_3))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS t2_1_has_t2_3 (
t2_1_name VARCHAR(45) NOT NULL,
t2_3_idt2_3 INT NOT NULL,
PRIMARY KEY (t2_1_name, t2_3_idt2_3),
INDEX fk_t2_1_has_t2_3_t2_31_idx (t2_3_idt2_3 ASC),
INDEX fk_t2_1_has_t2_3_t2_11_idx (t2_1_name ASC),
CONSTRAINT fk_t2_1_has_t2_3_t2_11
FOREIGN KEY (t2_1_name)
REFERENCES t2_1 (name)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_t2_1_has_t2_3_t2_31
FOREIGN KEY (t2_3_idt2_3)
REFERENCES t2_3 (idt2_3)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
最佳答案
t1 和 t3 之间的多对多关系在某些方面效率低下。请参阅my blog .
我经常使用 UNIQUE
key 进行 PK。我审阅了大量我设计的表格;只有 1/3 的 PK 具有 AUTO_INCRMENT
。一些注意事项(假设 InnoDB):
FOREIGN KEY
是有代价的——需要进行查找来检查隐含的“约束”。通常,代码的编写方式不会发生 FK 违规,从而使 FK 产生不必要的开销。 (其他人说 FK 很“好”。)回到你的问题...
INT
为 4 个字节; VARCHAR
是可变的,您尚未提供平均长度。因此,很难比较。您的架构将会变得更加复杂。您将添加更多列和更多索引,因此我关于二级索引的评论的相关性尚未确定。您可能认为 45 还不够。等等等等
底线:抛硬币决定从哪个架构开始,然后在架构成熟时从中学习。
关于mysql - 应该使用替代 PK 加唯一列还是使用唯一列的自然 PK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37337672/
甲骨文: create table t7(c1 number primary key,c2 number); insert into t7 values (1,3); insert into t
谁能告诉我为什么点击模板链接生成的url是/.pk。我想了解 url 是如何工作的。这里是 Django 新手。 Traceback (most recent call last): File "
我有以下 MySQL 触发器。它因 tbl_users 的更新而被触发。如果当天已经存在记录,它将用一些信息更新 tbl_user_stats;如果当天没有记录,它将在 tbl_user_stats
已知:tX_1.name 永远不能为 NULL,长度可变,最多 45 个字符,并且必须始终是唯一的。 哪些因素会影响是否应使用代理 PK 加唯一列(架构 1)或 PK 自然键是否使用第一个表的唯一列作
我有一个包含复合 PK(code_id、user_id)的表,它已经有 100k 条记录。从复合 PK 移动到单个 PK 是否安全,如下例所示? ALTER TABLE orders DROP C
为什么这个模型没有创建 pk 并提示相关模型的 pk 的完整性? 创建 UserProfile 的新实例时,它不会创建主键。 我正在遵循一对一的说明 in this tutorial (这就是所有 @
注意:我是 JPA 开发的新手,正在快速学习试用,所以请原谅我可能遗漏的任何明显内容。 以下是相关的 JPA 实体。地址未列出,但它是一个非常简单的实体,具有一个名为 id 的 @Id。 ShipTo
我们的系统中有两个实体,如下所示: Invoice:[InvoiceID, OrgID] 是表示为 bean 的主键,并使用 @IdClass 注释与 Invoice 相关联 WorkflowStat
场景:我遇到了一些在事务中将 JPA 与 JDBC 混合的代码。 JDBC 正在对基本上是空白行的表执行 INSERT,将主键设置为 (SELECT MAX(PK) + 1) 并将 middleNam
我有一个包含 3 个表的数据库:类别、项目、关系。 categories 包含类别。商品存储在items中,relation是一个绑定(bind)表,它存储了产品id和类别id或类别。 对于给定的项目
问题 当我尝试导入 CSV 文件时,我收到 key “PRIMARY”的重复条目“x-x-xx-x-x-x” - PK 错误。 PK 本身是两个连接的 varchar。据我所知,连接永远不会重复。 我
我正在尝试使用连接从两个大表中进行选择: EXPLAIN SELECT SQL_NO_CACHE e.* FROM `table_A` e JOIN (SELECT id FROM
我有这个 post_list.html 文件:(忽略第二个 'blog:post_detail' url) {% for post in post_list %} {{ post.title }}
我需要使用 JPA 处理现有数据库表。这些表使用复合主键。外键属性与表的主键重叠。 简化示例,每个“订单”都有许多“OrderItems” Table Order
据我所知,每当我在 JPA/Hibernate 实体内的 Long 字段上使用 @Id 和 @GeneratedValue 时,我实际上是在使用代理键,我认为这是定义主键的一种非常好的方式,考虑到我在
所以我有这段代码: request = self.factory.get(reverse('portal-edit-automation', args=(self.rule.id,))) respon
当在MySQL中使用InnoDB存储引擎时,如果在创建表时不指定PRIMARY KEY,则使用隐藏唯一索引作为聚集索引。由于数据字典上的互斥锁,我了解到这些隐藏索引可能会导致争用。 我的问题是 - 如
我正在尝试删除 table1 中与 table2 中具有匹配 PK 的所有行。尽管我的 WHERE 子句使用了键,但我收到错误 1175。我熟悉切换安全模式,但这不应该成为问题,因为我的 WHERE
我正在尝试更新具有外键字段的 View 的记录,因此出现错误,因为我尝试更新没有外键字段的另一个模型并且效果很好。 还有其他类似的问题,但就我而言,我通过了 pk。 urls.py urlpatte
Beeferman 的 PK 和 WindowDIFF 的 Python NLTK 实现从两者的 python segeval 实现中得到完全不同的结果。 使用相同的参数。 hyp: 01001000
我是一名优秀的程序员,十分优秀!