Mysql 单表或多表-标准化
我有一个问题可能很简单,你可以回答 我在下面有一张图片表 一幅图像可以有多种尺寸——有三张桌子更好吗 一个用于图像详细信息的表 另一个表将图像\详细信息连接到图像\路径,另一个表-图像\大小连接到图像路径 或者最好将所有图像大小都放在图像表中。实际上,我有一个图像,但大小不同。寻找优化的最佳选择。所有图像将具有每个图像大小,因此对于某些没有特定大小的图像,将来不会有冗余。我不确定是否最好使用另一张桌子,以防我们增加其他尺寸。但是,我可以为图像表添加另一列以获得新的图像大小 图像_表Mysql 单表或多表-标准化,mysql,database-design,Mysql,Database Design,我有一个问题可能很简单,你可以回答 我在下面有一张图片表 一幅图像可以有多种尺寸——有三张桌子更好吗 一个用于图像详细信息的表 另一个表将图像\详细信息连接到图像\路径,另一个表-图像\大小连接到图像路径 或者最好将所有图像大小都放在图像表中。实际上,我有一个图像,但大小不同。寻找优化的最佳选择。所有图像将具有每个图像大小,因此对于某些没有特定大小的图像,将来不会有冗余。我不确定是否最好使用另一张桌子,以防我们增加其他尺寸。但是,我可以为图像表添加另一列以获得新的图像大小 图像_表 CREATE
CREATE TABLE IF NOT EXISTS `warrington_main`.`image` (
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT ,
`user_id` BIGINT(20) UNSIGNED NOT NULL ,
`alias_title` VARCHAR(255) NOT NULL ,
`address_id` BIGINT(20) NULL ,
`geolocation_id` BIGINT(20) NULL ,
`camera_id` MEDIUMINT(8) NULL ,
`title` VARCHAR(100) NOT NULL ,
`description` VARCHAR(2000) NOT NULL ,
`main_image` VARCHAR(50) NOT NULL ,
`thumbnail_image` VARCHAR(50) NOT NULL ,
`thumbnail_image_medium` VARCHAR(50) NOT NULL ,
`thumbnail_image_small` VARCHAR(50) NOT NULL ,
`thumbnail_image_gallery` VARCHAR(50) NOT NULL ,
`hits` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0' ,
`show_comment` ENUM('0','1') NOT NULL ,
`feature_in_gallery` ENUM('0','1') NOT NULL ,
`created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`date_taken` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`updated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`updated_by` BIGINT(20) UNSIGNED NOT NULL ,
`approved` ENUM('Inprocess','Yes','No') NOT NULL DEFAULT 'Inprocess' ,
`visible` ENUM('0','1') NOT NULL DEFAULT '0' ,
`account_type_created` ENUM('S','Y', 'G', 'FL', 'FB') NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `alias_title` (`alias_title` ASC) ,
INDEX `title` (`title` ASC) ,
INDEX `approved` (`approved` ASC) ,
INDEX `visible` (`visible` ASC) ,
INDEX `feature_in_gallery` (`feature_in_gallery` ASC) ,
INDEX `fk_image_image_user1_idx` (`user_id` ASC) ,
INDEX `fk_image_camera1_idx` (`camera_id` ASC) ,
INDEX `fk_image_address1_idx` (`address_id` ASC) ,
INDEX `fk_image_geolocation1_idx` (`geolocation_id` ASC) ,
INDEX `fk_image_user1_idx` (`updated_by` ASC) ,
CONSTRAINT `fk_image_image_user1`
FOREIGN KEY (`user_id` )
REFERENCES `warrington_main`.`user` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_image_camera1`
FOREIGN KEY (`camera_id` )
REFERENCES `warrington_main`.`camera` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_image_address1`
FOREIGN KEY (`address_id` )
REFERENCES `warrington_main`.`address` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_image_geolocation1`
FOREIGN KEY (`geolocation_id` )
REFERENCES `warrington_main`.`geolocation` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_image_user1`
FOREIGN KEY (`updated_by` )
REFERENCES `warrington_main`.`user` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 23162
DEFAULT CHARACTER SET = utf8
您应该进行规范化,使用多个表,而不是在多个位置存储相同的信息。这种冗余避免了以后任何应用程序生命周期中出现的大量数据问题 因此,在您的情况下,
IMAGE\u SIZE
应该是另一个表,其IMAGE\u ID
定义为外键
IMAGE
ID
IMAGE_ATTRIBUTES
IMAGE_SIZE
ID
IMAGE_ID
SIZE_ATTRIBUTES
IMAGE_PATH
IMAGE_ID or IMAGE_SIZE_ID (depends)
PATH
您应该进行规范化,使用多个表,而不是在多个位置存储相同的信息。这种冗余避免了以后任何应用程序生命周期中出现的大量数据问题 因此,在您的情况下,
IMAGE\u SIZE
应该是另一个表,其IMAGE\u ID
定义为外键
IMAGE
ID
IMAGE_ATTRIBUTES
IMAGE_SIZE
ID
IMAGE_ID
SIZE_ATTRIBUTES
IMAGE_PATH
IMAGE_ID or IMAGE_SIZE_ID (depends)
PATH
在这种情况下,一个表可能是处理它的方法。如果所有的图像X都有各种尺寸,而您可能不会添加大量不同尺寸的图像 这三个表也可以工作,但是为什么要处理连接,而实际上您并没有获得多少收益呢
Images
ImageDetailsId (PK)
ImageSizeId (PK)
URL
...
Image_Details
ImageDetailsId
...
Image_Sizes (where this table is relatively static - small, medium, large..)
ImageSizeID
... (width? height? etc?)
在这种情况下,一个表可能是处理它的方法。如果所有的图像X都有各种尺寸,而您可能不会添加大量不同尺寸的图像 这三个表也可以工作,但是为什么要处理连接,而实际上您并没有获得多少收益呢
Images
ImageDetailsId (PK)
ImageSizeId (PK)
URL
...
Image_Details
ImageDetailsId
...
Image_Sizes (where this table is relatively static - small, medium, large..)
ImageSizeID
... (width? height? etc?)
一个表用于图像详细信息,另一个表用于将图像详细信息连接到图像路径,另一个表用于将图像大小连接到图像路径
这不是规范化,指的是希望对象的主要详细信息显示在一个表中,而占用更多空间(通常)且不属于常规筛选条件的辅助详细信息移动到另一个表中。这样做是为了减小第一个表的每条记录的大小,以便在每个数据库页面中有更多的记录,从而在筛选过程中通过的页面数量更少,IO更少,搜索速度更快
在您的例子中,将图像的所有属性保留在一个表中似乎很好
一个表用于图像详细信息,另一个表用于将图像详细信息连接到图像路径,另一个表用于将图像大小连接到图像路径
这不是规范化,指的是希望对象的主要详细信息显示在一个表中,而占用更多空间(通常)且不属于常规筛选条件的辅助详细信息移动到另一个表中。这样做是为了减小第一个表的每条记录的大小,以便在每个数据库页面中有更多的记录,从而在筛选过程中通过的页面数量更少,IO更少,搜索速度更快
就你而言,将图像的所有属性保留在一个表中似乎很好。数据的重新一致性在哪里?如果大小在一个表中,那么图像数据将是冗余的,因为多行将具有相同的图像信息。可能我读错了-我读错了,因为他的单表解决方案是这样的:
ImageID | Detail1 | Detail2.. | SmallImageURL | MediumImageURL…
其中每个ImageID都会显示所有ImageURL。我看不到重复一致性。如果每个值都不同,但没有冗余-即,如果一个图像的详细信息可以属于一个图像,并且一个图像对于每个大小都是不同的路径,那么我永远不会有冗余信息。然而,我不确定是否保留在一个表中违背了标准化的第一条规则。但是,没有联接可能会加快查询速度?在这种情况下,每次都需要添加一列-这不好吗,只是想找到最好的选择数据的重新一致性在哪里?如果大小出现在一个表中,那么图像数据将是冗余的,因为多行将具有相同的图像信息。也许我读错了-我读错了,因为他的单表解决方案是这样的:ImageID | Detail1 | Detail2SmallImageURL | MediumImageURL…
其中每个ImageID都会显示所有ImageURL。我看不到重复一致性。如果每个值都不同,但没有冗余-即,如果一个图像的详细信息可以属于一个图像,并且一个图像对于每个大小都是不同的路径,那么我永远不会有冗余信息。然而,我不确定是否保留在一个表中违背了标准化的第一条规则。但是,没有连接可能会加快查询速度?在这种情况下,每次都需要添加一列-这不是很好,只是试图找到最佳选项真的。。。在这个设计中。。。对于Image\u Size
和Image\u Details
的每个组合,您必须重复所有属性…Image\u Details有一个记录,对于每个图像(不同大小),您都链接到Image\u Details记录和Image\u Size(基本上是小/中/大等)。所以不,这基本上是一个表的解决方案被分成三个-我认为在这种情况下这是不必要的真的。。。在这个设计中。。。对于Image\u Size
和Image\u Details
的每个组合,您必须重复所有属性…Image\u Details有一个记录,对于每个图像(不同大小),您都链接到Image\u Details记录和Image\u Size(基本上是小/中/大等)。所以不,这是基本的