新足迹

 找回密码
 注册

精华好帖回顾

· 也许,你会懂的。。 (坑已填完) (2010-7-6) 月亮 · 冬季到北海道来看雪—干货和远方的诗(完,不排除心血来潮时再写点什么) (2018-1-26) 清墨水
· 征文活动: 留学生的滞留地: 克雷顿(MEL CLAYTON) (2010-9-13) 太有才了 · 旧纸箱的利用(更新,第三个成果——化妆盒华丽登场~) (2009-7-13) edith921
Advertisement
Advertisement
查看: 1311|回复: 8

.Net:RESTful / RIA web service on top of Dynamic Database Schema [复制链接]

发表于 2010-10-25 13:22 |显示全部楼层
此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请注意以下内容中的数据、格式都是pseudo data,不要对格式、具体的名字、数据花太多精力。

问题描述:
我们的数据库里面的表都是动态的。也即表的数量、名字都是根据客户需要动态的建立的。这些表的关系由一个ResourceAttributes表管理。比如:
如果用户需要定义一个关于书的表,他可以定义一个attribute叫做Book Details,数据库里就会为这个Attribute自动建一个表: tbl_Book_Details。ResourceAttributes表里面就会有一条记录row1,比方说,row1 { resourceClass = Book; Attribute = Book Details; AttributeTable = tbl_Book_Details }

有没办法对这样的架构使用RIA service?我觉得那些个Domain Service都是针对固定的database schema建立的。象我们这样的动态的database schema不好用。

你们对这样的状况是如何处理的?如何定义一个中间层从而可以使用RIA、Entity Framework或者RESTful web service against dynamically created database schema?

What I really wanted, are the access to the data stored in these dynamically created tables without knowing the table name at the design time. First I have to run a query against the ResourceAttributes table to get all the attributes for a given class Book.

目标描述:
我想写一些generic的RESTful web service来管理这些存在各个Attribute表里的数据。
比如: GET /Resource/Book/{id} 我期待拿到一个JSon格式的result, 我这里就举一些个简单的: book {_id = 1; Name = Call Of Duty; Book Details: {_id = 1; Platform = XBOX360; Media = CD}; Book Publisher: {_id = 1; Publisher = Activision}}
再比如: GET /Resource/Book, I expect a list of books in the above-mentioned format
再比如: PUT /Resource/Book/{id} 就相当于update a book object with given data.
etc.

但由于这些resource classes和Attributes都是用户定义的,除非query against ResourceAttribute这些表不可能在设计的时候知道这些resource class以及它们的Attribute的名字。这个service就不太好写。

[ 本帖最后由 混不到坑的萝卜 于 2010-10-25 14:29 编辑 ]
Advertisement
Advertisement

发表于 2010-10-25 14:21 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
don't create new table, use table like "TblAttrUsr",table schema定下来,EF就可以用,而且可以作restful的web service.

发表于 2010-10-25 14:32 |显示全部楼层

问题就在于table scheme也是动态的。每个Attirbute都不一样

此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-10-25 14:21 发表
don't create new table, use table like "TblAttrUsr",table schema定下来,EF就可以用,而且可以作restful的web service.


问题就在于table scheme也是动态的。每个Attirbute都不一样。

只知道前两个column是primary key columns,这两个column是across all the resource attributes都一样的。其他都是用户自定义的column名以及data type. 在我的例子里我用_id来代表了这个key。

发表于 2010-10-25 14:45 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2010-10-25 15:32 发表


问题就在于table scheme也是动态的。每个Attirbute都不一样。

只知道前两个column是primary key columns,这两个column是across all the resource attributes都一样的。其他都是用户自定义的column名以及data type. ...


这个table schema是一定的,比如说有columns: usr,tblname,attrName

比如说对usr A,他有两个table, 每个table有不同的attr,就有一下的rows:

a,tbl1,attr1
a,tbl1,attr2
a,tbl1,attr3
a,tbl1,attr4

a,tbl2,attr1
a,tbl2,attr2
a,tbl2,attr3

如果对于很复杂的系统,你可以有不同的tables, 如usr,tbl,attr(这个table包含data type),他们之间的关系是one to many

特殊贡献奖章

发表于 2010-10-25 14:51 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
动态的表很麻烦
不知到.net里有什么好方法
我一般是用一个表存储动态表的名字和columns,获取json格式就通过这个表得出
比如
id | table_name | field_id | field_name | field_type
1   |  table1            | 1             |book_name| String
2   |  table1            | 2             |book_title    | String
3   |  table2            | 1             |platform       | String
4   |  table2            | 2             |media          | String

敲了半天,发现跟乱码是一个意思
算了,也发吧,证明php跟.net做db也差不多

发表于 2010-10-25 14:52 |显示全部楼层

继续

此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在我们的Web App里面,UI都是根据要处理的instance的各个attribute来产生的。目前这个方式有一些问题,主要是性能很差,因为全都是在server side产生的,为每个不同的instance都需要反复的产生这些个UI。

所以我想了,如果我可以写一个service layer,来提供RESTful web service,那么我可以对某一个特定的resource class产生一个固定的UI,然后用Prev/Next button来navigate。就像是Access里面的FORM那样。
UI显示的数据可以用GET + id来获取,然后用jQuery来populate各个UI control显示这些数据。
按下保存按钮的时候就会发送一个PUT + id + JSon data去service那边处理。

这样的话我就可以把这个架构变成了MVC, V就是我的UI,这个UI可以用SilverLight可以用Web Form来写。C就是我的web service。M就是我的抽象数据层。
Advertisement
Advertisement

发表于 2010-10-25 14:56 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2010-10-25 15:52 发表
在我们的Web App里面,UI都是根据要处理的instance的各个attribute来产生的。目前这个方式有一些问题,主要是性能很差,因为全都是在server side产生的,为每个不同的instance都需要反复的产生这些个UI。

所以我想了,如果我 ...


这么做没什么问题啊,很好。

发表于 2010-10-25 14:58 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2010-10-25 15:51 发表
动态的表很麻烦
不知到.net里有什么好方法
我一般是用一个表存储动态表的名字和columns,获取json格式就通过这个表得出
比如
id | table_name | field_id | field_name | field_type
1   |  table1            | 1      ...


从data modeling这个角度来说,关系型数据库都是一样的,具体实现都差不多。

发表于 2010-10-25 15:29 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
CRM software (like Microsoft CRM) can do that but I don't know how.

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部