论坛首页 编程语言技术论坛

探讨企业级应用中,如何允许用户增加自定义字段

浏览 25807 次
精华帖 (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分钟就可以完成),对于后者,则很简单。


希望能对你有所帮助。

对我很有帮助。
不过如果是直接修改表的话,会不会影响以后的升级呢?
0 请登录后投票
   发表时间:2008-12-29  
最好采取 描述性存储

表中描述字段名称 类型 数据 等 每个数据做一行

缺点  浪费空间

0 请登录后投票
   发表时间: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都是有的,自己看看吧。
0 请登录后投票
   发表时间:2008-12-29  
用key,value吧.我们的项目有50张报表,每张都不一样!
因此我们定义了元结构模板!然后定义一个配置界面,
再定义一个计算模板.最后把这些结合起来!在这个结合出来的大模板下
去定义项目的50张表!而且这个定义过程不需要编码,用户都可以参与!
因此我们实施时,只演示一,两张报表的定义过程.剩下的由用户自己定义.
大大减少了开发和实施的时间.
不过key,value方式的问题会造成数据爆增!几个月下来,核心储存表的记录量已经达到百万了.不过表分区很好的解决了数据量大的问题.我们分了20个区,这样每个区就没这么大的数据了.
不知道对你有否帮助!
0 请登录后投票
   发表时间:2008-12-29  
我总觉得这种想很天真,如果仅查询下这样实现是可以的,如果有业务的话就不用想了吧!
0 请登录后投票
   发表时间:2008-12-29  
想好了,不修改表的方式,基本只是能做到存储查询的。如果带业务计算的话,就歇菜了。
0 请登录后投票
   发表时间:2008-12-29  
改表是不可行地
form_rr的方法我们用过
不过不是用在展现报表,而是用户界面
类似 salesforce 的自定义字段,自定义应用
0 请登录后投票
   发表时间:2008-12-29  
请问EAV进行如果进行复杂查询、汇总的话是不是有问题?
0 请登录后投票
   发表时间:2008-12-29  
引用
@kebo
不过如果是直接修改表的话,会不会影响以后的升级呢?


我不清楚你这里所谓的升级到底是什么意思?

倒是有个 mysql的row size限制问题,我提一下
 
  mysql的官方说明说,其row size最大为65535.但是如果只放一个varchar,那么该varchar最长为:21844。那么换算一下,最多能放200个 Length为100的varchar 。

  值得注意的是,mysql的text 或者blob是不计算在内的。因为这两个data type是另外分配单独的存储单元的。

0 请登录后投票
   发表时间:2008-12-29  
让用户自己开发了。。。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics