精华帖 (0) :: 良好帖 (15) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-29
dazuiba 写道 我年初做过一个系统,当时用户提出的需求和楼主的类似。 首先力劝楼主不要想着将字段key value Join到另外一张Meta表,这样做很别扭,一点也不直观,很难实现你所提出的查询需求。 我是直接alter table,具体方案如下: 1 运行时直接alter table,然后使用Model.reset_column_information来更新active_record的schma信息。 2 使用一张表property_definitions 来记录所有用户自定义的字段: Ruby代码 create_table "property_definitions" do |t| t.string "data_type",:null => false t.string "name",:null => false#显示在界面上的名字 t.text "description" t.string "column_name", :null => false t.string "table_name", :null => false end create_table "property_definitions" do |t| t.string "data_type",:null => false t.string "name",:null => false#显示在界面上的名字 t.text "description" t.string "column_name", :null => false t.string "table_name", :null => false end 这里有个细节,用户自定义的字段,有可能是一系列枚举值,也就是可提供一个列表工用户选择的那种,那么就需要一个enumeration_values Ruby代码 create_table "enumeration_values" do |t| t.string "value",:null => false t.integer "property_definition_id" t.integer "position" end create_table "enumeration_values" do |t| t.string "value",:null => false t.integer "property_definition_id" t.integer "position" end 以上是数据库相关的。 界面上总的可以分成两个部分,1是管理后台,2是使用界面 关于自定义列的管理,值得一提的是数据列默认值的设定,以及删除数剧列的检查 关于使用界面,我是分成几个partial来渲染的,分别是 text,text_area,select,date,通过查询property_definitions,我可以知道那个表的哪个列,应该用何种方式来显示。 最后,还有值得一提的一点是查询,客户要求实现基于自定义数剧列的全文检索以及数据库检索。对于前者,我是用ferret每日做重建索引(因为数据量不是很大,10分钟就可以完成),对于后者,则很简单。 希望能对你有所帮助。 对我很有帮助。 不过如果是直接修改表的话,会不会影响以后的升级呢? |
|
返回顶楼 | |
发表时间:2008-12-29
最好采取 描述性存储
表中描述字段名称 类型 数据 等 每个数据做一行 缺点 浪费空间 |
|
返回顶楼 | |
发表时间:2008-12-29
楼主为什么不去看一下magento的设计呢, key-value是比较流行的方法亚。
为了不浪费空间, 不同类型的值采用不同的表存储。 例如: Mysql数据库, 产品的一个表, 为了自定义字段, 就有product_field_long, product_field_text, product_field_varchar等等, 当然一个规则表/原数据表 product_field_meta 缺点就是性能可能慢一些, 不过可扩展性和空间使用性都很是最好的。 看一下开源的CMS, 都是你这种的需求, 我不知道openEdit(java的CMS)有没有这个功能, 但是magento, drupal都是有的,自己看看吧。 |
|
返回顶楼 | |
发表时间:2008-12-29
用key,value吧.我们的项目有50张报表,每张都不一样!
因此我们定义了元结构模板!然后定义一个配置界面, 再定义一个计算模板.最后把这些结合起来!在这个结合出来的大模板下 去定义项目的50张表!而且这个定义过程不需要编码,用户都可以参与! 因此我们实施时,只演示一,两张报表的定义过程.剩下的由用户自己定义. 大大减少了开发和实施的时间. 不过key,value方式的问题会造成数据爆增!几个月下来,核心储存表的记录量已经达到百万了.不过表分区很好的解决了数据量大的问题.我们分了20个区,这样每个区就没这么大的数据了. 不知道对你有否帮助! |
|
返回顶楼 | |
发表时间:2008-12-29
我总觉得这种想很天真,如果仅查询下这样实现是可以的,如果有业务的话就不用想了吧!
|
|
返回顶楼 | |
发表时间:2008-12-29
想好了,不修改表的方式,基本只是能做到存储查询的。如果带业务计算的话,就歇菜了。
|
|
返回顶楼 | |
发表时间:2008-12-29
改表是不可行地
form_rr的方法我们用过 不过不是用在展现报表,而是用户界面 类似 salesforce 的自定义字段,自定义应用 |
|
返回顶楼 | |
发表时间:2008-12-29
请问EAV进行如果进行复杂查询、汇总的话是不是有问题?
|
|
返回顶楼 | |
发表时间:2008-12-29
引用 @kebo
不过如果是直接修改表的话,会不会影响以后的升级呢? 我不清楚你这里所谓的升级到底是什么意思? 倒是有个 mysql的row size限制问题,我提一下 mysql的官方说明说,其row size最大为65535.但是如果只放一个varchar,那么该varchar最长为:21844。那么换算一下,最多能放200个 Length为100的varchar 。 值得注意的是,mysql的text 或者blob是不计算在内的。因为这两个data type是另外分配单独的存储单元的。 |
|
返回顶楼 | |
发表时间:2008-12-29
让用户自己开发了。。。
|
|
返回顶楼 | |