1

簡単に答えられるかもしれない質問があります

以下に画像テーブルがあります

画像は複数のサイズを持つことができます-3つのテーブルを持つ方が良い方法ですか

画像詳細の 1 つのテーブルは、image_details を image_paths に結合する別のテーブルと、画像パスに結合する別のテーブル image_sizes です。

または、すべての画像サイズを画像テーブルに入れるのが最善ですか。実際には、1 つの画像がありますが、サイズが異なります。最適化のための最良のオプションを探しています。すべての画像にはそれぞれの画像サイズがあるため、特定のサイズを持たない一部の画像について将来的に冗長性はありません。他のサイズを追加する場合に備えて、別のテーブルを使用するのが最善かどうかはわかりませんでした. ただし、新しい画像サイズの画像テーブルに別の列を追加できます

画像テーブル

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   
4

3 に答える 3

1

画像詳細の 1 つのテーブルは、image_details を image_paths に結合する別のテーブルと、画像パスに結合する別のテーブル image_sizes です。

これは正規化ではなく、オブジェクトの主要な詳細を 1 つのテーブルに表示し、(一般に) より多くのスペースを占有し、一般的なフィルタリング基準の一部ではない補助的な詳細を別のテーブルに移動する、垂直分割と呼ばれます。別のテーブル。これは、最初のテーブルの各レコードのサイズを縮小するために行われます。これにより、各データベース ページのレコード数が増えるため、フィルタリング中に通過するページ数が減り、IO が減り、検索機能が高速になります。

あなたの場合、画像のすべての属性を単一のテーブルに保持しても問題ないようです。

于 2012-09-15T18:27:25.383 に答える
0

複数のテーブルを使用し、同じ情報を複数の場所に保存しない正規化を行う必要があります。この冗長性により、アプリケーション ライフ サイクルの後半に発生する多数のデータの問題が回避されます。

したがって、あなたの場合、外部キーが定義されたIMAGE_SIZE別のテーブルが必要です。IMAGE_ID

IMAGE
    ID
    IMAGE_ATTRIBUTES

IMAGE_SIZE
    ID
    IMAGE_ID
    SIZE_ATTRIBUTES 

 IMAGE_PATH
    IMAGE_ID or IMAGE_SIZE_ID (depends)
    PATH 
于 2012-09-15T18:22:27.103 に答える
0

この場合、おそらく 1 つのテーブルで処理できます。すべての画像 X にすべてのサイズがあり、さまざまなサイズを大量に追加することはおそらくないでしょう。

3 つのテーブルも同様に機能しますが、実際にはあまり得られないのに、結合を処理する必要はありません。

Images
    ImageDetailsId (PK)
    ImageSizeId (PK)
    URL
    ...

Image_Details
   ImageDetailsId
   ...

Image_Sizes (where this table is relatively static - small, medium, large..)
   ImageSizeID
   ... (width? height? etc?)
于 2012-09-15T18:24:43.123 に答える