orient DB:向属性添加属性

时间:2015-02-02 21:46:41

标签: java database orientdb

我是orientdb的新手,我正在探索各种可能性。我有一个项目,我只是想确保我从正确的方向开始。

为了让您快速了解我想要做什么,可以将其想象为MS Access或Kexi,这意味着管理数据库的软件。这个解释足以解决我的问题。

将创建一些“表”来管理软件,并且用户将创建其他数据“表”。 Orient DB对类的每个“property”/“Field”使用以下“属性”。

名称
类型 Linked_Type
Linked_Class
强制性
READ_ONLY
NOT_NULL

最大
逐份

但对于用户数据库类“fields”,我想在其字段中添加更多属性。

所以我的第一个想法是,将具有这些添加属性的用户数据库的字段结构存储到数据库中。用户数据将被放入常规的方向数据库“表”中,而添加的字段/属性信息将存储在系统数据库中。

但我不知道在两个不同的地方保存信息,我想知道是否没有其他方法可以继续。例如,也许我可以扩展用于存储字段属性的类并添加我的新属性。但我不确定它是否真的可行。有一点可以肯定的是,Web界面将不再起作用,或者至少不显示那些添加的字段。

......我的问题清楚了吗?这只是令人困惑,因为在Orient DB字段中称为属性,它们也具有属性(如上所列)


更新

我想你所暗示的是NoSQL数据库的主要功能根本就没有结构。因此,定义无结构数据库的结构是没有意义的。

在这种情况下,如果我认为“结构”应保持灵活性,则可以将其实现为每个字段的元数据。例如,“字段”可以有一个“名称”,但这对我来说几乎没有足够的信息。我还需要:

  • 姓名
  • 短名称(缩写)
  • 描述

因此,例如,在用户界面中,可以显示该信息以帮助用户。或者,此信息可用于生成维基网页以用于文档目的。

如果实现为元数据,我可以有一个由类名和字段名索引的大表。每次我引用数据库字段时,如果元数据可用,我会查看该表。如果是,我使用它,如果不是,我只是忽略它。这将允许灵活的结构,因为即使没有定义元数据,也可以添加新的“字段”。

另外我选择OrientDB的原因不一定是缺乏结构,因为我喜欢结构化信息。它首先是因为如果继承,那么使类继承超类的能力。其次,因为任何对象都可以链接到任何对象。这些是我在关系数据库中无法做到的两件事。

我的项目的一部分是处理棋盘游戏组件,这些组件需要任何组件来包含任何组件。例如,游戏板可以容纳典当,代币和卡片。卡片也可以容纳棋子,代币等。这些物品在游戏过程中移动。因此,图形数据库似乎非常适用于此目的。

但是如果你有继承,僵硬的字段结构对我来说并不是真正的问题。例如,具有不同字段结构的多种卡只需要在超类中具有公共信息。例如,Item卡可以拥有超类“Item”,并且派生类称为“Weapon”,“Armor”,“Shield”,每个类都有自己的字段。


第二次更新

我尝试改变属性,它似乎工作,或者我应该说没有错误消息。但是当我尝试查询信息时,我什么都没得到。在控制台上它给了我:

----+------
#   |@CLASS
----+------
0   |null  
----+------

1 item(s) found. Query executed in 0.036 sec(s).

我尝试搜索谷歌有关自定义属性但几乎没有关于它的文档。

也许我可以尝试从java代码中读取它,因为这是我更有可能使用的。

我有点设法以这种方式看到信息

select expand(properties) from ( select expand(classes) from metadata:schema) where name='Item'

----+------+-----+----+--------+---------+--------+-------+----+----+------+------------------------------------------------------+-------
#   |@CLASS|name |type|globalId|mandatory|readonly|notNull|min |max |regexp|customFields                                          |collate
----+------+-----+----+--------+---------+--------+-------+----+----+------+------------------------------------------------------+-------
0   |null  |Name |7   |21      |false    |false   |false  |null|null|null  |{description="This is the name of the item", access=1}|default
1   |null  |Price|1   |22      |false    |false   |false  |null|null|null  |null                                                  |default
----+------+-----+----+--------+---------+--------+-------+----+----+------+------------------------------------------------------+-------

这意味着运行我在文档中找到的这个命令不起作用:

ALTER CLASS Item CUSTOM name.display=1

1 个答案:

答案 0 :(得分:3)

有趣的问题!

OrientDB的优点在于其灵活性。您决定是否要构建数据模型(定义架构约束)。执行模式约束是通过为这些类定义ClassesProperties并在这些属性上定义约束/方面(由OrientDB调用Attributes)来完成的。除了您列出的系统定义属性外,您还可以定义自定义属性。也许这就是你要找的地方。

示例:

CREATE CLASS MyTable
CREATE PROPERTY MyTable.name STRING
ALTER PROPERTY MyTable.name CUSTOM displayOrder=1

注意CUSTOM属性。 OrientDB本身忽略了这个属性(因为没有为它定义语义),所以你必须自己在应用程序中管理它。但是,您在一个地方定义了所有元数据。

要查询这些自定义属性:

select classes[name='MyTable'].properties[name='name'].customFields.displayOrder FROM metadata:schema