Base de datos

Una discusión a conciencia del diseño y la motivación del modelo de datos de Elgg.

Resumen

In Elgg, everything runs on a unified data model based on atomic units of data called entities.

Plugins are discouraged from interacting directly with the database, which creates a more stable system and a better user experience becase content created by different plugins can be mixed together in consistent ways. With this approach, plugins are faster to develop, and are at the same time much more powerful.

Every entity in the system inherits the ElggEntity class. This class controls access permissions, ownership

Existen dos maneras de extender las entidades con información adicional:

Metadata: This is information describing the entity, usually
added by the author of the entity when the entity is created. For example, tags, an ISBN number, a file location, or source language is metadata.
Annotations: This is information about the entity, usually
added by a third party after the entity is created. For example, ratings, likes, and votes are annotations. (Comments were before 1.9.)

Datamodel

The Elgg data model diagram

The Elgg data model diagram

Entidades

ElggEntity is the base class for the Elgg data model and supports a common set of properties and methods.

  • Un identificador numérico único (véase Identificadores únicos).
  • Permisos de acceso. Cuando un complemento solicita datos, no puede conseguir acceso a datos para los que el usuario actual no tiene permisos.
  • An arbitrary subtype (more below).
  • Un propietario.
  • El sitio al que pertenece la entidad.
  • A container, used to associate content with a group or a user.

Types

Actual entities will be instances of four different subclasses, each having a distinct type property and their own additional properties and methods.

Type PHP class Representa
object ElggObject Most user-created content, like blog posts, uploads, and bookmarks.
group ElggGroup An organized group of users with its own profile page
user ElggUser A system user
site ElggSite The site served by the Elgg installation

Each has its own extended API. E.g. objects have a title and description, users have a username and a way to set their password, and so on.

Subtypes

Each entity also has a custom string subtype, which plugins use to further specialize the entity. Elgg makes it easy to query specific subtypes as well as assign them special behaviors and views.

Subtypes are most commonly given to instances of ElggObject to denote the kind of content created. E.g. the blog plugin creates objects with subtype "blog".

For historic reasons, the subtype API is a bit complex, but boils down to: write to ->subtype before saving, otherwise always read getSubtype(). Below are more details.

Subtype Gotchas

  • Before an entity’s save() method is called, the subtype can be set by writing a string to the subtype property.
  • Subtype cannot be changed after saving.
  • After saving, you must always use getSubtype() to read it.
  • If no subtype was set, "" is returned, however some parts of the Elgg API (like Views) may map this value to the string "default". E.g. a group with getSubtype() === "" will be rendered using the view "group/default".
  • Read carefully the documentation for elgg_get_entities() before trying to match subtypes; this
  • API is a bit of a minefield. E.g. you cannot use "" to fetch entities with the default subtype.

Identificadores únicos

Un identificador único (GUID) es un número entero que identifica de manera inequívoca cada entidad de una instalación de Elgg. Se asigna de manera automática cuando la entidad se guarda por primera vez, y no se puede volver a cambiar nunca.

Algunas funciones de la API de Elgg funcionan con identificadores en vez de con instancias de ElggEntity.

ElggObject

El tipo de entidad ElggObject representa contenido arbitrario dentro de la instalación de Elgg. Puede representar, por ejemplo, artículos de blog, ficheros, etc.

Además de las propiedades estándar de ElggEntity, ElggObject ofrece las siguientes propiedades:

  • title: El título el objeto en texto escapado para HTML.
  • description Una descripción del objeto en HTML.

La mayor parte del resto de los datos sobre el objeto se almacenan mediante metadatos.

ElggUser

El tipo de entidad ElggUser representa a un usuario de la instalación de Elgg. Estos usuarios se marcan como desactivados hasta que se activan sus cuentas, a menos que sean creados desde el panel de administración.

Además de las propiedades estándar de ElggEntity, ElggUser ofrece las siguientes propiedades:

  • name: El nombre del usuario en texto plano. Por ejemplo: «Antonio García Fernández».
  • username: Nombre con el que el usuario accede al sistema. Por ejemplo, «antoniogf».
  • password: Una suma (hash) de la contraseña.
  • email: La dirección de correo electrónico.
  • language: El código del idioma predeterminado.
  • code: El código de la sesión, que a partir de la versión 1.9 está en una tabla separada.
  • last_action: La fecha en formato UNIX de la última vez que el usuario cargó una página.
  • prev_last_action: El valor anterior de last_action.
  • last_login: Fecha en formato UNIX de la última vez que el usuario accedió al sistema.
  • prev_last_login: El valor anterior de last_login.

ElggSite

El tipo de entidad ElggSite representa sitios dentro de la instalación de Elgg. En la mayoría de las instalaciones sólo se dispone de un único sitio.

Además de las propiedades estándar de ElggEntity, ElggSite ofrece las siguientes propiedades:

  • name: El nombre del sitio.
  • description: Una descripción del sitio.
  • url: La dirección URL del sitio.

ElggGroup

El tipo de entidad ElggGroup representa una asociación de usuarios de Elgg. Los usuarios pueden unirse a grupos, marcharse de ellos, o publicar contenido en ellos.

Además de las propiedades estándar de ElggEntity, ElggGroup ofrece las siguientes propiedades:

  • name: El nombre del grupo en texto escapado para HTML.
  • description Una descripción del grupo en HTML.

ElggGroup cuenta con métodos adicionales para gestionar su contenido y usuarios.

El complemento de grupos

Elgg incluye un complemento llamado «Grupos» que no debe confundirse con el tipo de entidad ElggGroup. El complemento provee la interfaz predeterminada con la que los usuarios del sitio pueden interactuar con los grupos. Cada grupo recibe un foro de discusiones y una página de perfil que pone a los usuarios en contacto con el contenido del grupo.

Usted puede cambiar la experiencia del usuario mediante los medios tradicionales de extender los complementos, o substituyendo el complemento de «Grupos» por su propio complemento.

Dado que ElggGroup puede tener un subtipo al igual que el resto de entidades, puede tener múltiples tipos de grupos en un mismo sitio.

Desarrollar un complemento compatible con grupos

Los desarrolladores de complementos no tienen por qué preocuparse mucho por que sus complementos sean compatibles con los grupos o sus funcionalidades, pero aquí van algunas claves a tener en cuenta:

Añadir contenido

Incluyendo el identificador del grupo como container_guid mediante un campo de entrada oculto, puede usar un mismo formulario para añadir contenido tanto a un usuario como a un grupo.

Use can_write_to_container para determinar si el usuario actual tiene o no permisos para añadir contenido a un grupo.

Tenga en cuenta que entonces tendrá que pasarle el identificador del contenedor o el nombre del usuario a la página responsable de publicar el contenido y el valor que lo acompañe, de forma que se pueda almacenar en su formulario como un campo de entrada oculto, para pasar fácilmente sus acciones. Dentro de una acción de crear, necesitará obtener este campo de entrada y guardarlo como una propiedad del nuevo elemento cuyo valor predeterminado es el contenedor del usuario actual:

$user = elgg_get_logged_in_user_entity();
$container_guid = (int)get_input('container_guid');
if ($container_guid) {
    if (!can_write_to_container($user->guid, $container_guid)) {
        // register error and forward
    }
} else {
    $container_guid = elgg_get_logged_in_user_guid();
}

$object = new ElggObject;
$object->container_guid = $container_guid;

...

$container = get_entity($container_guid);
forward($container->getURL());

Nombres de usuario y propiedad de las páginas

Los grupos tienen un nombre de usuario simulado con la forma group:identificador, un valor al que se puede acceder mediante $grupo->username. Si pasa este nombre de usuario a una página en la línea de la URL como parte de la variable username (es decir, /su_página?username=group:nnn), Elgg registrará automáticamente la página como propiedad del grupo (salvo que se indique un propietario distinto de manera explícita).

Alternando entre usuarios y grupos

Lo cierto es que ElggGroup simula la mayor parte de los métodos de ElggUser. Puede obtener el icono del grupo, el nombre u otros datos con los mismos métodos, y si pide los contactos de un grupo, obtendrá sus miembros. Esto ha sido diseñado de manera específica para que usted pueda alternar entre usuarios y grupos de manera sencilla desde código.

Propiedad

Las entidades tienen una propiedad, owner_guid, cuyo valor es el identificador único del propietario de la entidad. Habitualmente el identificador corresponde a un usuario, aunque tanto el propio sitio como sus usuarios no suelen tener propietario (el valor de la propiedad es 0).

La propiedad de una entidad determina, en parte, si un usuario puede o no acceder a la entidad o modificarla.

Contenedores

Para poder buscar contenido fácilmente por usuario o por grupo, el contenido se define generalmente como «contenido» por el usuario que lo publicó o el grupo en el que se publicó. Eso significa que a la propiedad container_guid de los nuevos objetos se le dará como valor el identificador único de la instancia de ElggUser actual o de la instancia de ElggGroup de destino.

Por ejemplo, tres artículos de blog podrían pertenecer a autores distintos, pero estar todos contenidos por el grupo en el que se publicaron.

Nota: Esto no es siempre cierto. Las entidades de comentarios son propiedad del que comentan, y en algunos complementos de terceros el contenedor podría usarse para modelar una relación de padre-hijo entre entidades (por ejemplo, un objeto «carpeta» que contiene un objeto «fichero»).

Anotaciones

Las anotaciones son fragmentos de datos anexados a una entidad y que permiten a los usuarios indicar puntuaciones o añadir con ellas otro tipo de información relevante a la entidad a la que se añaden. Un complemento de encuestas podría, por ejemplo, registrar los votos como anotaciones. Antes de Elgg 1.9, los comentarios y las respuestas a discusiones de grupo se almacenaban como anotaciones.

Las anotaciones se almacenan como instancias de la clase ElggAnnotation.

Cada anotación cuenta con:

  • Un tipo de anotación interno (como comment, «comentario»).
  • Un valor (que puede ser una cadena de texto o un número entero).
  • Un permiso de acceso distinto del de la entidad a la que está anexado.
  • Un propietario.

Like metadata, values are stored as strings unless the value given is a PHP integer (is_int($value) is true), or unless the $vartype is manually specified as integer.

Añadir una anotación

La forma más sencilla de añadir una anotación a una entidad es usar el método annotate de dicha entidad. La declaración de dicho método es la siguiente:

public function annotate(
    $name,           // The name of the annotation type (eg 'comment')
    $value,          // The value of the annotation
    $access_id = 0,  // The access level of the annotation
    $owner_id = 0,   // The annotation owner, defaults to current user
    $vartype = ""    // 'text' or 'integer'
)

Por ejemplo, para dejar una puntuación en una entidad, puede llamar a:

$entity->annotate('rating', $rating_value, $entity->access_id);

Leer anotaciones

Para obtener las anotaciones de un objeto, puedes llamar al método siguiente:

$annotations = $entity->getAnnotations(
    $name,    // The type of annotation
    $limit,   // The number to return
    $offset,  // Any indexing offset
    $order,   // 'asc' or 'desc' (default 'asc')
);

Por si el tipo de tu anotación lidia en gran medida con números enteros, tiene a su disposición una serie de funciones matemáticas que pueden resultarle útiles:

$averagevalue = $entity->getAnnotationsAvg($name);  // Get the average value
$total = $entity->getAnnotationsSum($name);         // Get the total value
$minvalue = $entity->getAnnotationsMin($name);      // Get the minimum value
$maxvalue = $entity->getAnnotationsMax($name);      // Get the maximum value

Funciones de asistencia útiles

Comentarios

Si quiere ofrecer la funcionalidad de dejar comentarios en los objetos de su complemento, la siguiente función se lo facilitará, formulario y acciones:

function elgg_view_comments(ElggEntity $entity)

Metadatos

En Elgg, los metadatos le permiten almacenar alguna información adicional en una entidad más allá de los campos predeterminados que ofrece la entidad. Por ejemplo, las instancias de ElggObject sólo ofrecen los campos de entidad básicos y campos para un título y una descripción, pero puede que quieras incluir etiquetas o un número ISBN. De manera similar, puede que quieras que los usuarios tengan la posibilidad de guardar una fecha de cumpleaños.

Internamente, los metadatos se almacenan como una instancia de ElggMetadata, pero usted no tiene que preocuparse de eso en la práctica (pero si le interesa, échele una ojeada la la documentación de referencia de la clase). Lo único que necesita saber es que:

  • Metadata has an owner and access ID (see note below), both of which may be different to the owner of the entity it’s attached to
  • Usted podría tener varios elementos de cata tipo de metadatos anexados a una única entidad.
  • Like annotations, values are stored as strings unless the value given is a PHP integer (is_int($value) is true), or unless the $value_type is manually specified as integer (see below).

Nota

Metadata’s access_id value will be ignored in Elgg 3.0 and all metadata values will be available in all contexts.

El caso más simple

Añadir metadatos

Para añadir un metadato a una entidad, llama a:

$entity->metadata_name = $metadata_value;

Por ejemplo, para añadir una fecha de cumpleaños a un usuario:

$user->dob = $dob_timestamp;

O para añadir un par de etiquetas a un objeto:

$object->tags = array('tag one', 'tag two', 'tag three');

Al añadir metadatos mediante el procedimiento anterior:

  • El usuario actual se convierte en el propietario de los metadatos.
  • Access permissions are inherited from the entity (see note below)
  • Al reasignar un metadato, este substituye cualquier valor previo de ese mismo metadato.

Esto funciona bien para la mayoría de los casos. Tenga cuidado de anotar qué atributos son metadatos y cuales son parte integral del tipo de entidad con el que está trabajando. No tiene por qué guardar una entidad después de añadirle o actualizar sus metadatos. Pero si lo que ha cambiado son sus atributos integrales, debe guardar la entidad para preservar sus cambios. Por ejemplo, si ha cambiado el identificador de acceso de un objeto de tipo ElggObject, tiene que guardar el objeto, o de lo contrario el cambio no se hará efectivo en la base de datos.

Nota

Metadata’s access_id value will be ignored in Elgg 3.0 and all metadata values will be available in all contexts.

Leer metadatos

Para obtener un metadato, haga lo mismo que haría con una propiedad de la entidad:

$tags_value = $object->tags;

Nota: El método anterior devolverá el valor absoluto del metadato. Para obtener el metadato como una instancia de ElggMetadata, use los métodos descritos en la sección Un mayor control más adelante.

Si almacena varios valores en este metadato (como en el ejemplo de las etiquetas), obtendrá un vector (array) con todos esos valores. Si sólo almacenó un valor, obtendrá una cadena de texto o un número entero. Si almacenó un vector con un único valor, el metadato devolverá una cadena de texto. Por ejemplo:

$object->tags = array('tag');
$tags = $object->tags;
// $tags will be the string "tag", NOT array('tag')

Para obtener siempre un vector, no tiene más que invocar el método como tal:

$tags = (array)$object->tags;

Un mayor control

Añadir metadatos

Si necesita más control para, por ejemplo, asignar un identificador de acceso distinto del identificador predeterminado, puede usar la función create_metadata, que está declarada así:

function create_metadata(
    $entity_guid,           // The GUID of the parent entity
    $name,                  // The name of the metadata (eg 'tags')
    $value,                 // The metadata value
    $value_type,            // Currently either 'text' or 'integer'
    $owner_guid,            // The owner of the metadata
    $access_id = 0,         // The access restriction
    $allow_multiple = false // Do we have more than one value?
    )

Para valores individuales, puede escribir el metadato de la siguiente manera (siguiendo con el ejemplo de la fecha de cumpleaños anexada a un usuario):

create_metadata($user_guid, 'dob', $dob_timestamp, 'integer', $_SESSION['guid'], $access_id);

Nota

$access_id will be ignored in Elgg 3.0 and all metadata values will be available in all contexts. Always set it to ACCESS_PUBLIC for compatibility with Elgg 3.0.

Para varios valores, tendrá que iterar por ellos y llamar a create_metadata una vez por cada valor. El siguiente código ha sido extraído de Elgg, concretamente de la acción de guardar de los perfiles:

$i = 0;
foreach ($value as $interval) {
    $i++;
    $multiple = ($i != 1);
    create_metadata($user->guid, $shortname, $interval, 'text', $user->guid, $access_id, $multiple);
}

Nota: El parámetro allow_múltiple (permitir varios) se pone a false en la primera iteración y a true (verdadero) en las siguientes.

Leer metadatos

elgg_get_metadata es la mejor función para obtener metadatos como instancias de ElggMetadata:

Por ejemplo, para obtener la fecha de cumpleaños (DOB) de un usuario:

elgg_get_metadata(array(
    'metadata_name' => 'dob',
    'metadata_owner_guid' => $user_guid,
));

O para obtener todos los objetos de metadatos:

elgg_get_metadata(array(
    'metadata_owner_guid' => $user_guid,
    'limit' => 0,
));

Errores habituales

“Anexar” metadatos

No puede “anexar” valores a vectores de metadatos como si fuesen simples vectores de PHP. Por ejemplo, el siguiente código no hace lo que parece que debería hacer:

$object->tags[] = "tag four";

Intentar almacenar mapas de sumas («hashmaps»)

Elgg no permite almacenar mapas ordenados (parejas con nombre y valor) en metadatos. Por ejemplo, el siguiente código no funcionaría como uno cabría esperar en un principio:

// Won't work!! Only the array values are stored
$object->tags = array('one' => 'a', 'two' => 'b', 'three' => 'c');

En vez de eso, puede hacer lo siguiente para almacenar la información:

$object->one = 'a';
$object->two = 'b';
$object->three = 'c';

Almacenar identificadores únicos en metadatos

Aunque existen algunos casos en los que tiene sentido almacenar identificadores únicos en metadatos, las relaciones son una construcción mucho mejor para relacionar unas entidades con otras.

Relaciones

Las relaciones permiten asociar entidades las unas con las otras. Por ejemplo: un artista que tiene fans, un usuario que es miembro de una organización, etc.

La clase ElggRelationship modela una relación con dirección entre dos entidades, dando lugar a la expresión:

«{sujeto} es un {substantivo} de {objeto}
Nombre en el API Modela Representa
guid_one Sujeto La entidad que se está relacionando.
relationship Substantivo El tipo de la relación.
guid_two Objeto La entidad con la que se relaciona el sujeto.

Alternativamente, el tipo de relación puede ser un verbo, dando lugar a la expresión:

«{sujeto} {verbo} {objeto}

Por ejemplo, el usuario A «está de acuerdo con» el comentario B.

Toda relación tiene una dirección. Imagínese un arquero disparando una flecha al objeto. La flecha se mueve en una dirección, relacionando el sujeto (el arquero) con el objeto.

Las relaciones no implicar reciprocidad. Que A siga a B no significa que B siga a A.

Las relaciones_ carecen de control de acceso. Nunca se les ocultan a las vistas, y pueden editarse mediante código independientemente del nivel de privilegios, con la pega de que las entidades de la relación podrían sí ser invisibles por culpa del control de acceso.

Trabajar con relaciones

Crear una relación

Por ejemplo, para establecer que «$user es un fan de $artist», donde $user (usuario) es el sujeto y $artist (artista) el objeto:

// option 1
$success = add_entity_relationship($user->guid, 'fan', $artist->guid);

// option 2
$success = $user->addRelationship($artist->guid, 'fan');

Esto desencadena el evento [create, relationship], pasando a éste el objeto de tipo ElggRelationship creado. Si un manejador devuelve false, la relación no se creará y $success (que indica si todo fue correctamente) pasará a ser false.

Verificar una relación

Por ejemplo, para verificar que «$user es fan de $artist»:

if (check_entity_relationship($user->guid, 'fan', $artist->guid)) {
    // relationship exists
}

Tenga en cuenta que, si la relación existe, check_entity_relationship() devuelve una instancia de ElggRelationship:

$relationship = check_entity_relationship($user->guid, 'fan', $artist->guid);
if ($relationship) {
    // use $relationship->id or $relationship->time_created
}

Eliminar una relación

Por ejemplo, para poder asegurarse de que «$user ya no es fan de $artist»:

$was_removed = remove_entity_relationship($user->guid, 'fan', $artist->guid);

Esto desencadena el evento [delete, relationship], pasando a éste el objeto de tipo ElggRelationship asociado. Si un manejador devuelve false, la relación seguirá existiendo y $was_removed («se eliminó») pasará a ser false.

Otras funciones útiles:

  • delete_relationship() : eliminar la relación con el identificador indicado.
  • remove_entity_relationships() : eliminar aquellas entidades que estén relacionadas con una entidad determinada. Nota: en versiones de Elgg anteriores a la 1.9 esto no desencadenaba los eventos de eliminación.

Control de acceso

Los controles de acceso granular son uno de los principio de diseño fundamentales de Elgg, y una funcionalidad que ha estado en el centro de el sistema a lo largo de su desarrollo. La idea es sencilla: un usuario debería tener todo el control sobre quién puede ver un dato que ha creado dicho usuario.

Controles de acceso en el modelo de datos

Para conseguir esto, toda entidad, anotación y metadato contiene una propiedad access_id (identificador de acceso) que se corresponde con uno de los controles de acceso predefinidos o una entrada en la tabla access_collections de la base de datos.

Controles de acceso predefinidos

  • ACCESS_PRIVATE (value: 0) Private.
  • ACCESS_LOGGED_IN (value: 1) Logged in users.
  • ACCESS_PUBLIC (value: 2) Public data.
  • ACCESS_FRIENDS (value: -2) Owner and his/her friends.

Controles de acceso definidos por los usuarios

Usted puede definir grupos de acceso adicionales y asignárselos a entidades, anotaciones o metadatos. Existen para ayudarle a ello una serie de funciones; para más información, vea la documentación de referencia de la biblioteca de acceso.

Cómo el acceso afecta a la obtención de datos

Todas las funciones de obtención de datos que hay sobre la capa de la base de datos —como get_entities y similares— sólo devuelven elementos a los que el usuario actual tiene acceso de lectura. No es posible obtener elementos a los que el usuario actual no tiene acceso. Esto dificulta el crear una brecha de seguridad en la obtención de datos.

Acceso de escritura

Las siguientes reglar rigen el acceso de escritura:

  • El propietario de una entidad siempre puede editarla.
  • El propietario de un contenedor puede editar todo lo que hay en el contenedor. Nota: Ello no significa que el propietario de un grupo pueda editar cualquier cosa dentro del grupo).
  • Los administradores pueden editarlo todo.

You can override this behaviour using a plugin hook called permissions_check, which passes the entity in question to any function that has announced it wants to be referenced. Returning true will allow write access; returning false will deny it. See the plugin hook reference for permissions_check for more details.

Esquema

La base de datos contiene una serie de tablas primarias y secundarias. Su esquema de tabla está almacenado en /engine/schema/mysql.sql.

Cada tabla está prefijada con «prefix_», que la infraestructura de Elgg substituye por el prefijo seleccionado durante la instalación.

Tablas principales

Esta es una descripción de las tablas principales. No se olvide de que en toda instalación de Elgg estas tablas tienen un prefijo, que suele ser «elgg_».

Tabla: entidades

Esta es la tabla principal de entidades, y contiene a los usuarios de Elgg, los sitios, los objetos y los grupos. Cuando instala Elgg por primera vez, la tabla se rellena automáticamente con su primer sitio.

Contiene los siguientes campos:

  • guid: Un contador que aumenta automáticamente y produce un identificador único para la entidad dentro del sistema.
  • type: El tipo de la entidad (object, user, group o site).
  • subtype A reference to the entity_subtypes table, or 0 for the default subtype.
  • owner_guid: El identificador único del propietario de la entidad.
  • site_guid: El sitio al que pertenece la entidad.
  • container_guid: El identificador único de la entidad que contiene a esta, que puede ser un usuario o un grupo.
  • access_id: Los controles de acceso de la entidad.
  • time_created: La fecha y hora de creación de la entidad en formato Unix.
  • time_updated: La fecha y hora de la última actualización de la entidad en formato Unix.
  • enabled: Si su valor es «yes» se puede acceder a la entidad, si es «no» la entidad está desactivada (Elgg la trata como si hubiese sido eliminada pero sin que se haya eliminado realmente de la base de datos).

Tabla: entity_subtypes

Esta tabla contiene información sobre los subtipos de las entidades:

  • id: Un contador.
  • type: El tipo de la entidad (object, user, group o site)..
  • subtype: El nombre del subtipo en forma de cadena de texto.
  • class: Nombre de clase opcional si el subtipo está enlazado con una clase.

Tabla: metadata

Esta tabla contiene metadatos, información adicional anexada a una entidad.

  • id: Un contador.
  • entity_guid: Identificador de la entidad a la que está anexado el metadato.
  • name_id: Un enlace a la tabla «metastrings» que define el nombre.
  • value_id: Un enlace a la tabla «metastrings» que define el valor.
  • value_type: La clase del valor, o bien «text» (texto) o bien «integer» (número entero).
  • owner_guid: El identificador único del propietario, es decir, de quien definió el metadato.
  • access_id: Los controles de acceso del metadato.
  • time_created: La fecha y hora de creación del metadato en formato Unix.
  • enabled: Si su valor es «yes» se puede acceder al elemento, si es «no» el elemento ha sido eliminado.

Tabla: annotations

Esta tabla contiene anotaciones, que no son lo mismo que metadatos.

  • id: Un contador.
  • entity_guid: Identificador de la entidad a la que está anexado el metadato.
  • name_id: Un enlace a la tabla «metastrings» que define el tipo de anotación.
  • value_id: Un enlace a la tabla «metastrings» que define el valor.
  • value_type: La clase del valor, o bien «text» (texto) o bien «integer» (número entero).
  • owner_guid: El identificador único del propietario, es decir, de quien definió el metadato.
  • access_id: Los controles de acceso del metadato.
  • time_created: La fecha y hora de creación del metadato en formato Unix.
  • enabled: Si su valor es «yes» se puede acceder al elemento, si es «no» el elemento ha sido eliminado.

Tabla: relationships

Esta tabla define relaciones, las cuales enlazan unas entidades con otras.

  • guid_one: El identificador de la entidad sujeto.
  • relationship: El tipo de la relación.
  • guid_two: El identificador de la entidad objeto.

Tabla: objects_entity

Información adicional relacionada específicamente con objetos. Estos están divididos para reducir la carga de la tabla de metadatos y hacer una diferencia obvia entre los atributos y los metadatos.

Tabla: sites_entity

Información adicional relacionada específicamente con sitios. Estos están divididos para reducir la carga de la tabla de metadatos y hacer una diferencia obvia entre los atributos y los metadatos.

Tabla: users_entity

Información adicional relacionada específicamente con usuarios. Estos están divididos para reducir la carga de la tabla de metadatos y hacer una diferencia obvia entre los atributos y los metadatos.

Tabla: groups_entity

Información adicional relacionada específicamente con grupos. Estos están divididos para reducir la carga de la tabla de metadatos y hacer una diferencia obvia entre los atributos y los metadatos.

Tabla: metastrings

Las metastrigns (metacadenas) contiene los textos reales de los metadatos, y que están enlazados con las tablas de metadatos y de anotaciones.

Esto permite evitar duplicar cadenas, ahorrando espacio y haciendo más eficientes las búsquedas en la base de datos.