EAV 替代用户定义字段?

发布于 2024-08-03 22:40:05 字数 248 浏览 7 评论 0原文

鉴于用户必须能够在对象上定义自己的字段,并为这些字段定义允许的值 - 动态(无编译) - 如何在不使用 EAV

示例:所有对象都需要一个或多个对 123 statusnumber 的引用(允许 1.a 或 2.b 或 3.c)。

Given that users must be able to define their own fields on an object, and define allowed values for these fields - on the fly (no compile) - how would you solve this without using EAV?

Example: All objects need one or more reference to the 123 statusnumber (1.a or 2.b or 3.c allowed).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一人独醉 2024-08-10 22:40:05

关系数据库实际上依赖于预定义的稳定模式的存在。
也许您应该查看面向文档的数据库。它们通常允许按文档自由地动态定义属性。

至于模式验证,如果用户可以更改模式本身,则可能需要在您的应用程序中完成。

Relational databases really rely on the presence of a pre-defined and stable schema.
Maybe you should look at document-oriented databases instead. They generally allow free definition of attributes, per document, and on-the-fly.

As for the schema validation, that probably needs to be done in your application if the schema itself can be changed by the user.

苍白女子 2024-08-10 22:40:05

如果您必须使用关系数据库,那么有一个(笨拙的)解决方法。我还会推荐 EAV(如果可以的话)或 Thilo 的建议。这是执行此操作的关系方法。

预先警告。以下是这种方法的局限性:

  1. 我们假设最大界限
    用户可以查看的列数
    为每种数据类型创建。
  2. 如果许多用户只使用其中的几列,我们将得到稀疏表
  3. 我们需要一个用户为每一列添加含义的概念
  4. 这是对正常形式的严重违反

_

create table main_tbl(

numColumn1 number(10),

numColumn2 number(10),

numColumn3 number(10),

numColumn4 number(10),

numColumn5 number(10),

charColumn1 varchar2(100),

charColumn2 varchar2(100),

charColumn3 varchar2(100),

charColumn4 varchar2(100),

charColumn5 varchar2(100),

dateColumn1 date,

dateColumn2 date,

dateColumn3 date,

dateColumn4 date,

dateColumn5 date

)


create table main_tblmeaning(

user_id varchar(25) foreign key references users_tbl (user_id),

numColumn1_name varchar2(50),

numColumn2_name varchar2(50),

numColumn3_name varchar2(50),

numColumn4_name varchar2(50),

numColumn5_name varchar2(50),

numColumn6_name varchar2(50),

charColumn1_name varchar2(50),

charColumn2_name varchar2(50),

charColumn3_name varchar2(50),

charColumn4_name varchar2(50),

charColumn5_name varchar2(50),

dateColumn1_name varchar2(50),

dateColumn2_name varchar2(50),

dateColumn3_name varchar2(50),

dateColumn4_name varchar2(50),

dateColumn5_name varchar2(50)


)

create table users_tbl(

user_id varchar2(25) primary key,

user_name varchar2(50)

)

每次用户想要一个数字列时,您都会为他分配一个空闲的列main_tbl 中的数字列 (numColumn1 - 5)。在 main_tbl_meanings 中添加一个条目(行),将列 (numcolumn1-5) 映射到用户提供的用户可读名称。

If you must use a relational DB, then there is a (clumsy) workaround. I would also recommed EAV (if you can) or Thilo's suggestion. Here is the relational way of doing it.

Be forewarned. Here are the limitations of this approach:

  1. We are assuming a maximum bound on
    the number of columns a user can
    create for each data type.
  2. We will have sparse tables if many users use only a few of the columns
  3. We need the notion of a user who adds meaning to each column
  4. It is a gross violation of Normal forms

_

create table main_tbl(

numColumn1 number(10),

numColumn2 number(10),

numColumn3 number(10),

numColumn4 number(10),

numColumn5 number(10),

charColumn1 varchar2(100),

charColumn2 varchar2(100),

charColumn3 varchar2(100),

charColumn4 varchar2(100),

charColumn5 varchar2(100),

dateColumn1 date,

dateColumn2 date,

dateColumn3 date,

dateColumn4 date,

dateColumn5 date

)


create table main_tblmeaning(

user_id varchar(25) foreign key references users_tbl (user_id),

numColumn1_name varchar2(50),

numColumn2_name varchar2(50),

numColumn3_name varchar2(50),

numColumn4_name varchar2(50),

numColumn5_name varchar2(50),

numColumn6_name varchar2(50),

charColumn1_name varchar2(50),

charColumn2_name varchar2(50),

charColumn3_name varchar2(50),

charColumn4_name varchar2(50),

charColumn5_name varchar2(50),

dateColumn1_name varchar2(50),

dateColumn2_name varchar2(50),

dateColumn3_name varchar2(50),

dateColumn4_name varchar2(50),

dateColumn5_name varchar2(50)


)

create table users_tbl(

user_id varchar2(25) primary key,

user_name varchar2(50)

)

Each time a user wants a number column you assign him a free number column (numColumn1 - 5) in the main_tbl . Add an entry (row) in the main_tbl_meanings that would map the column (numcolumn1-5) to a user readable name supplied by the user.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文