关于数据库表设计问题,请教大家

chbq1210 2009-11-23 10:26:49
现在我想做个图文数据库,故名思义,描述文字比较多。为了使数据库的扩展性好一点,我打算尽量少使用具体数据的属性描述表,因为用户可能随时会增减表的字段,增加字段就增加表的行,显示的时候用行转列。存数据主要用到的表:

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_property_codes')
DROP TABLE tbl_property_codes
GO
CREATE TABLE tbl_property_codes --属性代码表
(
id smallint PRIMARY KEY, --索引id
viewid smallint NOT NULL, --视图索引,一个视图就是显示给用户的一个虚拟表,用户可以自定义该表的字段
valtype smallint NOT NULL, --数据类型,int,float, image,text,datatime
name varchar(50) NOT NULL, --属性名称
unit varchar(25) --属性单位
)
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_int')
DROP TABLE tbl_data_int
GO
CREATE TABLE tbl_data_int --存放int数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val int NOT NULL --数值
)

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_float')
DROP TABLE tbl_data_float
GO
CREATE TABLE tbl_data_float --存放float数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --显示行号
val float NOT NULL --数值
)

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_datetime')
DROP TABLE tbl_data_datetime
GO
CREATE TABLE tbl_data_datetime --存放datetime数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val datetime NOT NULL --数值
)

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_image')
DROP TABLE tbl_data_image
GO
CREATE TABLE tbl_data_image --存放float数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val image NOT NULL --数值
)

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_text')
DROP TABLE tbl_data_text
GO
CREATE TABLE tbl_data_text
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val nvarchar(x) NOT NULL --数值
)

三个问题:
1. 这种方式做会不会有重大的缺陷?本人没有多大设计经验。要实现的这个数据库内容不是很多,图片多一些。容量最坏的情况最大几个G吧。
2. 如果可以该方式可行,有两个细节问题,
a. tbl_data_text这里x多长为好?字段值可能两三个汉字,也可以上百个字!有没有必要做成 tbl_data_text_8,tbl_data_text_32,tbl_data_text_256 之类的限制nvarchar的长度,后面根据内容长度存相应表中?
3. 关于上面几个data表,如果是同一组数据,那么rowid相同,显示的时候根据codeid显示属性名,rowid组合数据为具体的行,有没有比较好的查询显示方法?我现在是可以实现,便感觉比较笨。比如有数据:

INSERT INTO tbl_property_codes --建表的时候顺便插的几个记录。
SELECT 1, 0, 3, '中文名称', '' UNION ALL
SELECT 2, 0, 3, '拉丁文名称','' UNION ALL
SELECT 3, 0, 1, '引种号', '' UNION ALL
SELECT 4, 0, 3, '原产地', ''
--插几个样本数据。
INSERT INTO tbl_data_text (id,codeid,rowid,val) VALUES (1,1,1,'小黄鸟鹤蕉')
INSERT INTO tbl_data_text (id,codeid,rowid,val) VALUES (2,2,1,'Heliconia acuminata cv. Yellow Waltz')
INSERT INTO tbl_data_int (id,codeid,rowid,val) VALUES (1,3,1,10000)
INSERT INTO tbl_data_text (id,codeid,rowid,val) VALUES (3,4,1,'巴西或夏威夷')

--查询大概思路,在查询的时候知道当前虚拟表的所有字段id如下面的1,2,3,4,SQL可以让程序生成。但个人觉得虽然可以实现,但是感觉比较笨重。有没有好一点的办法?
SELECT t1.val AS '中文名称',t2.val AS '拉丁文名称',t3.val AS '引种号',t4.val AS '原产地'
FROM
(SELECT id,codeid,rowid,val FROM tbl_data_text WHERE codeid=1) AS t1,
(SELECT id,codeid,rowid,val FROM tbl_data_text WHERE codeid=2) AS t2,
(SELECT id,codeid,rowid,val FROM tbl_data_int WHERE codeid=3) AS t3,
(SELECT id,codeid,rowid,val FROM tbl_data_text WHERE codeid=4) AS t4
WHERE t1.rowid = t2.rowid AND t2.rowid=t3.rowid AND t3.rowid=t4.rowid


请高手指点,不够加分,谢谢!

...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chbq1210 2009-11-24
  • 打赏
  • 举报
回复
接受建议,因为图片可能会有两三M一张,主要用来描述性状特征,现在数码相机像素高,不可能强迫用户先修改图片。
Rotel-刘志东 2009-11-24
  • 打赏
  • 举报
回复
1、建议图片还是存放路径了。
2、数据类型的选择了。
chbq1210 2009-11-24
  • 打赏
  • 举报
回复
如果我设定nvarchar(255),而存放数据只有几个字符,那么在数据库中到底是255长还是我的实际字符长度?
victorcai2006 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
1.图片的还是建议存路径
2.定义成变长就行了  给一定的扩展性就行了
3.你的这个和case when 差不多 


[/Quote]

1.图片的还是建议存路径
如果LZ在数据库里面存放的图片较小或数据记录较少还可以,但是如果数据量比较大,并且表数据读取较为频繁,还是强烈推荐小F的建议,避免今后改起来麻烦。
ChinaJiaBing 2009-11-23
  • 打赏
  • 举报
回复

1.字段型设成可变长度的 nvarchar类型...
2.查询时用 join  on 条件一and 条件二...
chbq1210 2009-11-23
  • 打赏
  • 举报
回复
自己在应用程序下建一个目录,把数据库中要显示的图片都copy到该目录下,并记录该路径?
--小F-- 2009-11-23
  • 打赏
  • 举报
回复
1.图片的还是建议存路径
2.定义成变长就行了 给一定的扩展性就行了
3.你的这个和case when 差不多

34,592

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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