【问题标题】:orient DB: Adding properties to propertiesorient DB:向属性添加属性
【发布时间】:2015-02-02 21:46:40
【问题描述】:

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

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

将创建一些“表格”来管理软件,而其他数据“表格”将由用户创建。 Orient DB 为类的每个“属性”/“字段”使用以下“属性”。

名称
类型 Linked_Type
Linked_Class
强制
只读
Not_Null
最小
马克斯
整理

但是对于用户数据库类“字段”,我想为他们的字段添加更多属性。

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

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

...我的问题清楚了吗?这只是令人困惑,因为在东方 DB 字段被称为属性也有属性(上面列出)


更新

我想你暗示的是 NoSQL 数据库的主要功能根本没有结构。所以为无结构数据库定义结构有点没有意义。

在这种情况下,如果我认为“结构”应该保持灵活,它可以实现为每个字段的元数据。例如,一个“字段”可以有一个“名称”,但这对我来说还不够。我还需要:

  • 全名
  • 简称(缩写)
  • 说明

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

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

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

我的项目的一部分是处理需要任何组件来包含任何组件的棋盘游戏组件。例如,游戏板可以容纳 Pawns、令牌和卡片。卡片还可以存放棋子、代币等。这些物体在游戏过程中会四处移动。因此,图形数据库似乎非常适合此目的。

但是,如果您有继承,那么严格的字段结构对我来说并不是真正的问题。例如,拥有多种不同字段结构的卡片只需要在一个超类中具有共同的信息。例如,物品卡可以具有超类“物品”,并具有名为“武器”、“盔甲”、“盾牌”的派生类,每个类都有自己的字段。


第二次更新

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

----+------
#   |@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

【问题讨论】:

标签: java database orientdb


【解决方案1】:

有趣的问题!

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

【讨论】:

  • 嗯!这可能很有趣。只要我能查询到信息就可以了。
  • 到目前为止,我对 orient DB 的严格模式的唯一问题是,更改类的模式不会影响追溯修改已创建的对象。所以我必须让我的程序完成向已创建的对象添加或删除字段的工作。
  • 是的,这是真的。架构更改必须由您的应用程序管理。 OrientDB 还没有(还没有?)处理这个问题。但是,使用这种方法,您可以将所有元数据放在一个位置。这是一个优势,我明白,这就是您要寻找的地方。
  • 关于查询此信息:请参阅我的更新答案。请注意,使用info class 命令时看不到自定义属性,另请参阅this issue
  • 感谢您的信息,我会试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多