一个商品对应多张图片,数据库这样设计是否合理??有没有更好的办法?

chongan_wang 2010-04-29 12:54:53
商品表:goods
id 商品ID
describe 商品描述
pic1Count 商品白天拍照效果的图片总数
pic2Count 商品晚上拍照效果的图片总数


图片表:pictable
id 本张图片的ID
tableName 图片所属的表的表名(如:goods)
tableFieldName 图片所属的表中的字段名(如,pic1count 或者 pic2count),该字段用于区分同一个表中不同性质的图片
picAddr 图片地址

数据库查询时候的处理办法:
要想获取goods表中的pic1count的所有图片,则SQL语句这么写
select * from pictable where tableName='goods' and tableFieldName='pic1count';

-------------------------
以上就是我的设计方案。
现在有些问题:

1 查询效率问题
这么做,如果图片表小的时候,效率上没什么区别,但是,如果图片表数据在9千万条的时候,我每次这么一查,就得从9千万条中去搜索可能每个商品就那么三四张图片。这个效率上是有问题的了。

2 硬编码问题
图片表中,保存的是表名和字段名,这就存在很明显的硬编码问题了,万一以后表名和字段名需要改动,岂不是很麻烦了??


所以,大家说下你们一般都是怎么设计这个的吧,提下你的宝贵意见,谢谢!

注意:举例的时候,请考虑到 商品表 中会存在 不同性质图片的情况,而不只是一种性质的图片。因为如果只是一种的话就简单了,直接 图片表 里存 商品表名就足够了。不需要 字段名 来区分了。
...全文
1071 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chongan_wang 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 crazylaa 的回复:]
图片表把商品id也存进去,也就是说所属tableName+所属PK去决定你这张图片属于哪个商品。tableFieldName没用,白天还是晚上还是黄昏是属于照片的一个属性,用之做关联显然不合适。
图片表goods:
goods_id bigint,
goods_desc
***
照片表pictable:
pic_id bigint,
table_name
table_record_……
[/Quote]

恩 ,在图片表里我写漏掉一个字段了 就是 msgId--也就是表中信息的ID
小贝壳666 2010-04-29
  • 打赏
  • 举报
回复
2 硬编码问题
图片表中,保存的是表名和字段名,这就存在很明显的硬编码问题了,万一以后表名和字段名需要改动,岂不是很麻烦了??

例如三个表A,B,C 分别创建图片表APic,BPic,CPic,如下

商品图片表:goodsPic
id 商品图片ID
goodid 商品ID
fieldType 图片类型 NUMBER型
picAddr 图片地址

或者建一个图片表:
图片表:pictable
id 图片ID
tableType 所属表类型 NUMBER型
fieldType 图片类型 NUMBER型
picAddr 图片地址

crazylaa 2010-04-29
  • 打赏
  • 举报
回复
图片表把商品id也存进去,也就是说所属tableName+所属PK去决定你这张图片属于哪个商品。tableFieldName没用,白天还是晚上还是黄昏是属于照片的一个属性,用之做关联显然不合适。
图片表goods:
goods_id bigint,
goods_desc
***
照片表pictable:
pic_id bigint,
table_name
table_record_pk bigint,
pic_addr
pic_time_type int (0白天1晚上2黄昏3****)
****
建立table_name,table_record_pk的复合索引

查询某个商品goods_id=1的所有白天的照片:
select * from pictable where table_name = 'GOODS' and table_record_pk = 1 and pic_time_type=0;
查商品的所有白天图片:
select * from pictable where table_name = 'GOODS' and pic_time_type=0;
查商品的所有图片:
select * from pictable where table_name = 'GOODS';
查其他东东的白天图片:
select * from pictable where table_name = 'OTHER' and pic_time_type=0;

2.你说的硬编码不必考虑。表名字段名一般是不改变的,就像你的名字,你会整天改来改去么?

3.图片表数据量大,可以考虑分区。
随便说说,个人建议了。
BearKin 2010-04-29
  • 打赏
  • 举报
回复
你把整个系统的图片信息都保存到一个表里 有那个必要么?
whlcy 2010-04-29
  • 打赏
  • 举报
回复
分成几个表。。
  • 打赏
  • 举报
回复
基本上看懂了,用一对多吧 在图片表放个商品的主键ID
小贝壳666 2010-04-29
  • 打赏
  • 举报
回复
1 查询效率问题
这么做,如果图片表小的时候,效率上没什么区别,但是,如果图片表数据在9千万条的时候,我每次这么一查,就得从9千万条中去搜索可能每个商品就那么三四张图片。这个效率上是有问题的了。

这个完全不用担心,即使是九千条记录也不会慢的。
MySQL 教程MySQL 是流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。什么是数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成databaseRDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:数据库数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。MySQL数据库MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 是开源的,目前隶属于 Oracle 旗下产品。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。MySQL 对PHP有很好的支持,PHP 是目前流行的 Web 开发语言。MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。Redis 教程REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧