gpt4 book ai didi

php - 多个 MSQL 表和外键

转载 作者:行者123 更新时间:2023-11-29 01:43:45 25 4
gpt4 key购买 nike

我想知道在使用 Yii 和 mysql 表时什么是更好的方法(性能方面):

  1. 1 个包含所有列的表格
  2. 具有外键关系的多个表(在它们之间分布列)

基本上,我要问的是:当您执行查询时,Yii 会将所有对应的表提取到对象中,因此当单个表有很多关系时,是否会降低性能?

一个更普遍的问题是:在处理 1 vs 多个表和外键时什么是好的实践和更聪明的方法(同样是性能......)

最佳答案

如果性能是您设计策略中唯一的标准,您会选择 1。这是一个非常糟糕的选择,这会给您带来很多问题。

数据库的设计应该考虑到规范化,所以毫无疑问,您必须选择选项 2!

更新

规范化和非规范化的例子:假设我们有一张 DVD 租赁表,并且想跟踪谁租了 DVD:

平板:

CREATE TABLE DVD (
DvdId INT NOT NULL AUTO_INCREMENT,
DvdTitle varchar(64),
Rental1 varchar(64),
Rental2 varchar(64),
Rental3 varchar(64),
Primary Key(DvdId)
);

有 3 个租赁条目的空间,之后有麻烦。除此之外,当客户的电话号码需要一个额外的字段时,必须多做3个字段。

第一步归一化:

CREATE TABLE DVD (
DvdId INT NOT NULL AUTO_INCREMENT,
DvdTitle varchar(64),
Primary Key(DvdId)
);

CREATE TABLE Rentals (
RentalId INT NOT NULL AUTO_INCREMENT,
DvdId INT NOT NULL,
CustomerName varchar(64),
RentalDate DateTime,
Primary Key(RentalId)
);

这样更好,但仍未完全归一化。如果客户两次租用同一张 DVD 怎么办?然后在租金表中会有一个双重客户条目。

最后:

CREATE TABLE DVD (
DvdId INT NOT NULL AUTO_INCREMENT,
DvdTitle varchar(64),
Primary Key(DvdId)
);

CREATE TABLE Rentals (
RentalId INT NOT NULL AUTO_INCREMENT,
DvdId INT NOT NULL,
CustomerId INT NOT NULL,
RentalDate DateTime,
Primary Key(RentalId)
);

CREATE TABLE Customers (
CustomerId INT NOT NULL AUTO_INCREMENT,
CustomerName varchar(64),
Primary Key(CustomerId)
);

关于php - 多个 MSQL 表和外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12741447/

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