Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 定向数据库:将属性添加到属性_Java_Database_Orientdb - Fatal编程技术网

Java 定向数据库:将属性添加到属性

Java 定向数据库:将属性添加到属性,java,database,orientdb,Java,Database,Orientdb,我是orientdb的新手,我正在探索各种可能性。我心中有一个项目,我只想确保我开始的方向是正确的 为了让您快速了解我想要做什么,可以将其想象为MS Access或Kexi,这意味着一种管理数据库的软件。这个解释就足以回答我的问题了 将创建一些“表”来管理软件,其他数据“表”将由用户创建。Orient DB为类的每个“属性”/“字段”使用以下“属性” 名称 类型 链接类型 链接的_类 强制性 只读 非空值 最小值 最大值 整理 但是对于用户数据库类“fields”,我想向其字段添加更多属性 所以

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

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

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

名称
类型 链接类型
链接的_类
强制性
只读
非空值
最小值
最大值
整理

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

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

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

。。。我的问题清楚吗?这很让人困惑,因为在orient DB中,字段被称为属性,这些属性也有属性(如上所列)


更新

我想您暗示的是NoSQL数据库的主要特性是根本没有结构。因此,为无结构数据库定义结构有点毫无意义

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

  • 全名
  • 简称
  • 描述
例如,在用户界面中,可以显示这些信息来帮助用户。或者该信息可用于生成用于文档目的的wiki网页

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

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

我的项目的一部分是处理需要任何组件包含任何组件的棋盘游戏组件。例如,游戏板可以存放典当、代币和卡片。在这里,卡还可以存放典当、代币等。这些物品在游戏中会被移动。因此,图形数据库似乎非常适合这一目的

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


第二次更新

我试图改变财产,它似乎工作,或者我应该说,并没有错误信息。但是当我试图查询信息时,我什么也得不到。在控制台上,它给了我:

----+------
#   |@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
有趣的问题

OrientDB的优点在于它的灵活性。您可以决定是否要构造数据模型(定义模式约束)。通过为这些类定义和定义这些属性上的约束/方面(由OrientDB调用),可以强制实施模式约束。除了列出的系统定义的属性外,还可以定义自定义属性。也许这就是你要找的地方

例如:

CREATE CLASS MyTable
CREATE PROPERTY MyTable.name STRING
ALTER PROPERTY MyTable.name CUSTOM displayOrder=1
请注意自定义属性。OrientDB本身忽略此属性(因为没有为其定义语义),因此您必须在应用程序中自己管理它。但是,您在一个位置定义了所有元数据

要查询这些自定义属性,请执行以下操作:

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

我强烈建议你首先观看这个(非常好而且免费的)视频课程:嗯!那可能很有趣。到目前为止,我对orient DB的严格模式所遇到的唯一问题是,更改类的模式不会影响追溯修改已经创建的对象。因此,我必须让我的程序为已经创建的对象添加或删除一个字段。是的,这是真的。架构更改必须由应用程序管理。OrientDB(还没有?)处理这个问题。然而,通过这种方法,您可以在一个地方拥有所有元数据。这是一个优势,我明白,这正是您想要的。关于此信息的查询:请参阅我的更新答案。注意:使用
info class
命令时,您看不到自定义属性,另请参见感谢提供的信息,我将尝试一下。