关于数据导入的解决方案设计

leonbingo 2013-06-23 03:21:36
各位,最近要做一个数据采集和导入的系统,通常特定的数据导入相对比较简单,我这里的想法就是,我们能否设计一个中间的通用的数据库结构,我这里有一个初步的草稿,

首先,我要定义一个实体,比如说,一本书,一个学生,类似于这样,
然后,我为这个实体定义属性,比如,书有多少页,学生多大年龄这样

那么定义出来的表就成了这样

/****** 实体属性表 ******/
CREATE TABLE [dbo].[EntityProperty](
[Id] [int] IDENTITY(1,1) NOT NULL,
[EntityId] [int] NOT NULL,
[Type] [int] NOT NULL,
[Name] [nvarchar](60) NOT NULL,
[Alias] [nvarchar](60) NULL,
[Description] [nvarchar](200) NULL,
[CreatedOn] [date] NOT NULL,
[UpdatedOn] [date] NULL,
CONSTRAINT [PK_EntityProperty] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** 实体表 ******/

CREATE TABLE [dbo].[Entity](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](60) NOT NULL,
[Description] [nvarchar](200) NULL,
[CreatedOn] [date] NOT NULL,
[UpdatedOn] [date] NULL,
CONSTRAINT [PK_Entity] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

/****** 属性值表 ******/
CREATE TABLE [dbo].[PropertyValue](
[Id] [int] IDENTITY(1,1) NOT NULL,
/****** 这个Identity是用来区分一个实体的标示符的,比如说,一个学生的ID,这样我就能取得所有该学生的所有属性 ******/
[PropertyIdentity] [nvarchar](64) NOT NULL,
[PropertyId] [int] NOT NULL,
[Value] [nvarchar](4000) NOT NULL,
CONSTRAINT [PK_PropertyValue] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO



这样的话就可以动态的定义列了,而不用每次新来一个实体,我们就要为之建立一个固定的表,但是这里也有一个问题,我们需要对实体进行查询,这个查询我就一下子不知道怎么弄了,因为现在的存储结构是一行一个属性,另外我这种设计,也比较好进行逻辑上的导入,比如我可以建立一个关系,某某属性,要导入到目标数据库表中的某某字段

因为我对数据库研究不多,请各位帮忙看看,这个解决方案的优点和缺点,另外,如果有更好的方案麻烦告知,分不够可另开贴给分,原则就是,动态(不用来了新的数据结构就要建表),方便导入目标数据库。
...全文
258 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsp3ng 2013-07-25
  • 打赏
  • 举报
回复
属性表是很灵活,会给程序编增加很多工作量,估计用户界面动态排版比较麻烦. 查询速度会偏向子查询, 影响速度。 建议还是把已知的属性建成固定的字段, 未知或者护展的属性预设定10-20个字段应该能满足以后扩展使用,其实扩展字段用的越多,同时表示对实体的属性了解不多。
---涛声依旧--- 2013-06-25
  • 打赏
  • 举报
回复
这样设计应该蛮不错的,很通用,但是你要导入到其他数据库中时会有点麻烦了,因为你的属性是自定义的,必须弄清其关系或原则后才能导入了
Andy__Huang 2013-06-25
  • 打赏
  • 举报
回复
建议你建一个大表,设计有很多列,如100列,都是字nvarchar类型,加一个类型字段,区分从哪里导过来的。 如: create table tb(DataType nvarchar(50),col1 nvarchar(200),col2 nvarchar(200),col3 nvarchar(200)...........,col100 nvarchar(200)) 当然不一定需要100列, 做这样一个能用表,根据实际需要导入多少列,而且有可能你不用写太难的sql语句 得到数据后,你想什么处理都行。
最爱午夜 2013-06-24
  • 打赏
  • 举报
回复
你需要建立一个映射表, 一开始把数据做好映射,然后程序去读取映射表的关系,根据关系建立表和字段,插入新的数据时,再根据选择的映射关系,插入对应的信息到映射表,同时用SQL去判断是否是添加新表或者在原表基础上增加字段。 映射表必须包含: 1、属性ID,实体ID,字段名称,字段类型,长度,是否允许为空,是否是索引,等等。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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