{"id":2953,"date":"2017-03-16T06:58:49","date_gmt":"2017-03-16T13:58:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2953"},"modified":"2023-06-19T03:19:59","modified_gmt":"2023-06-19T10:19:59","slug":"fakeit-series-shared-data-dependencies","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-shared-data-dependencies\/","title":{"rendered":"FakeIt Serie 2 de 5: Datos compartidos y dependencias"},"content":{"rendered":"<p>Aaron Benton es un arquitecto experimentado especializado en soluciones creativas para desarrollar aplicaciones m\u00f3viles innovadoras. Tiene m\u00e1s de 10 a\u00f1os de experiencia en desarrollo full stack, incluyendo ColdFusion, SQL, NoSQL, JavaScript, HTML y CSS. Aaron es actualmente Arquitecto de Aplicaciones para Shop.com en Greensboro, Carolina del Norte y es un <a href=\"https:\/\/developer.couchbase.com\/experts-and-champions\">Campe\u00f3n de la comunidad Couchbase<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-2974\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg\" alt=\"Aaron Benton\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-150x150.jpg 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-768x768.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-65x65.jpg 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-50x50.jpg 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000-20x20.jpg 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/aaronb-benton-headshot_1000x1000.jpg 1000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2><strong>FakeIt Serie 2 de 5: Datos compartidos y dependencias<\/strong><\/h2>\n<p>En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-generating-fake-data\/\">FakeIt Serie 1 de 5: Generaci\u00f3n de datos falsos<\/a>\u00a0aprendimos que FakeIt puede generar una gran cantidad de datos aleatorios basados en un \u00fanico archivo YAML y enviar los resultados a varios formatos y destinos, incluyendo Couchbase Server. Hoy vamos a explorar lo que hace FakeIt verdaderamente \u00fanico y poderoso en el mundo de la generaci\u00f3n de datos.<\/p>\n<p>Hay montones de generadores de datos aleatorios disponibles, un simple <u><a href=\"https:\/\/www.google.com\/webhp?sourceid=chrome-instant&amp;ion=1&amp;espv=2&amp;ie=UTF-8#q=random+data+generator&amp;*\" target=\"_blank\" rel=\"noopener noreferrer\">B\u00fasqueda en Google<\/a><\/u>\u00a0le dar\u00e1 m\u00e1s que suficiente donde elegir. Sin embargo, casi todos ellos tienen el mismo defecto frustrante: s\u00f3lo pueden trabajar con un \u00fanico modelo. Rara vez como desarrolladores tenemos el lujo de tratar con un solo modelo, m\u00e1s a menudo que no estamos desarrollando contra m\u00faltiples modelos para nuestros proyectos. Aqu\u00ed es donde FakeIt se destaca, que permite m\u00faltiples modelos y los modelos que tienen dependencias.<\/p>\n<p>Echemos un vistazo a los posibles modelos que tendremos dentro de nuestra aplicaci\u00f3n de comercio electr\u00f3nico:<\/p>\n<ul>\n<li>Usuarios<\/li>\n<li>Productos<\/li>\n<li>Carrito<\/li>\n<li>Pedidos<\/li>\n<li>Rese\u00f1as<\/li>\n<\/ul>\n<p>Usuarios, el primer modelo que definimos no tiene dependencias y lo mismo puede decirse del modelo Productos, que definiremos a continuaci\u00f3n. Sin embargo, ser\u00eda l\u00f3gico decir que nuestro modelo de Pedidos depender\u00eda tanto del modelo de Usuarios como del de Productos. Si realmente queremos datos de prueba, los documentos creados por nuestro modelo Pedidos deber\u00edan ser los datos aleatorios reales generados a partir de los modelos Usuarios y Productos.<\/p>\n<h3><strong>Productos Modelo<\/strong><\/h3>\n<p>Antes de ver como funcionan las dependencias de modelos en FakeIt definamos como va a ser nuestro modelo de Productos.<\/p>\n<pre class=\"lang:default decode:true\">nombre: Productos\r\ntipo: objeto\r\nclave: _id\r\npropiedades:\r\n  _id:\r\n    tipo: cadena\r\n    descripci\u00f3n: Id del documento\r\n    datos:\r\n      post_build: `product_${this.product_id}``.\r\n  doc_type\r\n    type: string\r\n    descripci\u00f3n: Tipo de documento\r\n    dato:\r\n      valor: producto\r\n  product_id:\r\n    tipo: cadena\r\n    descripci\u00f3n: Identificador \u00fanico que representa a un producto espec\u00edfico\r\n    datos:\r\n      build: faker.random.uuid()\r\n  precio\r\n    tipo: double\r\n    descripci\u00f3n: Precio del producto\r\n    datos:\r\n      build: chance.floating({ min: 0, max: 150, fixed: 2 })\r\n  precio_venta:\r\n    tipo: double\r\n    descripci\u00f3n: Precio del producto\r\n    datos:\r\n      post_build: |\r\n       let precio_venta = 0;\r\n       if (chance.bool({ probabilidad: 30 })) {\r\n         precio_venta = chance.floating({ min: 0, max: this.price * chance.floating({ min: 0, max: 0.99, fixed: 2 }), fixed: 2 });\r\n       }\r\n       return precio_venta;\r\n  nombre_visualizaci\u00f3n:\r\n    tipo: cadena\r\n    descripci\u00f3n: Nombre para mostrar del producto.\r\n    datos:\r\n      build: faker.commerce.productName()\r\n  descripci\u00f3n_breve:\r\n    tipo: string\r\n    descripci\u00f3n: Descripci\u00f3n del producto.\r\n    datos:\r\n      build: faker.lorem.paragraphs(1)\r\n  descripci\u00f3n_larga:\r\n    tipo: cadena\r\n    descripci\u00f3n: Descripci\u00f3n del producto.\r\n    datos:\r\n      build: faker.lorem.paragraphs(5)\r\n  palabras clave:\r\n    tipo: array\r\n    descripci\u00f3n: Una matriz de palabras clave\r\n    elementos:\r\n      tipo: string\r\n      datos:\r\n        min: 0\r\n        max: 10\r\n        construcci\u00f3n: faker.random.word()\r\n  disponibilidad:\r\n    tipo: cadena\r\n    descripci\u00f3n: El estado de disponibilidad del producto\r\n    datos:\r\n      build: |\r\n       let disponibilidad = 'En stock';\r\n       if (chance.bool({ probabilidad: 40 })) {\r\n         availability = faker.random.arrayElement([ 'Preorder', 'Out of Stock', 'Discontinued' ]);\r\n       }\r\n       return disponibilidad;\r\n  fecha_disponibilidad:\r\n    type: integer\r\n    descripci\u00f3n: Hora en la que el producto est\u00e1 disponible\r\n    datos:\r\n      build: faker.date.recent()\r\n      post_build: new Date(this.availability_date).getTime()\r\n  producto_slug:\r\n    tipo: cadena\r\n    descripci\u00f3n: La versi\u00f3n URL amigable del nombre del producto\r\n    datos:\r\n      post_build: faker.helpers.slugify(this.display_name).toLowerCase()\r\n  categor\u00eda:\r\n    tipo: cadena\r\n    descripci\u00f3n: Categor\u00eda del producto\r\n    datos:\r\n      build: faker.commerce.department()\r\n  category_slug:\r\n    type: string\r\n    descripci\u00f3n: La versi\u00f3n URL amigable del nombre de la categor\u00eda\r\n    datos:\r\n      post_build: faker.helpers.slugify(this.category).toLowerCase()\r\n  imagen:\r\n    tipo: cadena\r\n    descripci\u00f3n: URL de la imagen que representa el producto.\r\n    datos:\r\n      build: faker.image.image()\r\n  alternate_images:\r\n    tipo: array\r\n    descripci\u00f3n: Una matriz de im\u00e1genes alternativas para el producto\r\n    art\u00edculos:\r\n      tipo: string\r\n      datos:\r\n        min: 0\r\n        max: 4\r\n        compilaci\u00f3n: faker.image.image()<\/pre>\n<p>Este modelo es un poco m\u00e1s complejo que nuestro anterior modelo de Usuarios. Examinemos algunas de estas propiedades con m\u00e1s detalle:<\/p>\n<ul>\n<li><strong>_id<\/strong>: Este valor se establece despu\u00e9s de que todas las propiedades del documento hayan sido construidas y est\u00e1 disponible para la funci\u00f3n de post-construcci\u00f3n. El contexto es el del documento actual que se est\u00e1 generando.<\/li>\n<li><strong>precio_venta<\/strong>: Esto mediante la definici\u00f3n de una probabilidad 30% de un precio de venta y si hay un precio de venta de garantizar que el valor es inferior a la de la propiedad de precio<\/li>\n<li><strong>palabras clave<\/strong>: Es un array. Esto se define de manera similar a Swagger, definimos nuestros elementos de matriz y c\u00f3mo queremos que se construyan utilizando las funciones build \/ post_build. Adicionalmente, podemos definir valores min y max y FakeIt generar\u00e1 un n\u00famero aleatorio de elementos del array entre estos valores. Tambi\u00e9n hay una propiedad fija que se puede utilizar para generar un n\u00famero determinado de elementos de la matriz.<\/li>\n<\/ul>\n<p>Ahora que hemos construido nuestro modelo de Productos generemos algunos datos aleatorios y envi\u00e9moslos a la consola para ver c\u00f3mo se ven usando el comando:<\/p>\n<pre class=\"lang:default decode:true\">consola fakeit models\/products.yaml<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5702 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/blog2-example1-1-compressor.gif\" alt=\"Blog 2 example1-1\" width=\"800\" height=\"448\" \/><\/p>\n<h3><strong>Modelo de pedidos<\/strong><\/h3>\n<p>Para nuestro proyecto ya hemos definido los siguientes modelos:<\/p>\n<ul>\n<li>usuarios.yaml<\/li>\n<li>productos.yaml<\/li>\n<\/ul>\n<p>Empecemos definiendo un modelo de \u00d3rdenes sin propiedades y especificando sus dependencias:<\/p>\n<pre class=\"lang:default decode:true\">nombre: Pedidos\r\ntipo: objeto\r\nclave: _id\r\ndatos:\r\n  dependencias:\r\n    - products.yaml\r\n    - usuarios.yaml\r\npropiedades:<\/pre>\n<p>Hemos definido dos dependencias para nuestro modelo de Pedidos, y las hemos referenciado por su nombre de fichero. Dado que todos nuestros modelos se almacenan en el mismo directorio no hay raz\u00f3n para especificar la ruta completa. En tiempo de ejecuci\u00f3n, FakeIt primero analizar\u00e1 todos los modelos antes de intentar generar documentos, y determinar\u00e1 un orden de ejecuci\u00f3n basado en cada una de las dependencias de los modelos (si las hay).<\/p>\n<p>Cada una de las funciones de construcci\u00f3n en un modelo FakeIt es un cuerpo de funci\u00f3n, con los siguientes argumentos que se le pasan.<\/p>\n<pre class=\"lang:default decode:true\">function (documents, globals, inputs, faker, chance, document_index, require) {\r\n return faker.internet.nombre_usuario();\r\n}\r\n\r\n<\/pre>\n<p>Una vez establecido el orden de ejecuci\u00f3n, cada una de las dependencias se guarda en memoria y se pone a disposici\u00f3n del modelo dependiente a trav\u00e9s del argumento documentos. Este argumento es un objeto que contiene una clave para cada modelo cuyo valor es un array de cada documento que se ha generado. Para nuestro ejemplo de la propiedad documents tendr\u00e1 un aspecto similar a este:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n \"Usuarios\": [\r\n   ...\r\n ],\r\n \"Productos\": [\r\n   ...\r\n ]\r\n}\r\n\r\n<\/pre>\n<p>Podemos aprovechar esto para recuperar documentos aleatorios de Producto y Usuario asignando sus propiedades a propiedades dentro de nuestro modelo de Pedidos. Por ejemplo, podemos recuperar un user_id aleatorio de los documentos generados por el modelo Users y asignarlo al user_id del modelo Orders a trav\u00e9s de una funci\u00f3n build<\/p>\n<pre class=\"lang:default decode:true\">user_id:\r\n    tipo: entero\r\n    descripci\u00f3n: El user_id que realiz\u00f3 el pedido\r\n    datos:\r\n      build: faker.random.arrayElement(documents.Users).user_id;<\/pre>\n<p>Definamos c\u00f3mo ser\u00e1 el resto de nuestro modelo de Pedidos:<\/p>\n<pre class=\"lang:default decode:true\">nombre: Pedidos\r\ntipo: objeto\r\nclave: _id\r\ndatos:\r\n  dependencias:\r\n    - products.yaml\r\n    - usuarios.yaml\r\npropiedades:\r\n  _id:\r\n    tipo: cadena\r\n    descripci\u00f3n: El id del documento\r\n    datos:\r\n      post_build: `order_${this.order_id}`\r\n  doc_type\r\n    type: string\r\n    descripci\u00f3n: Tipo de documento\r\n    datos:\r\n      valor: \"orden\"\r\n  order_id:\r\n    tipo: entero\r\n    descripci\u00f3n: El order_id\r\n    datos:\r\n      construcci\u00f3n: document_index + 1\r\n  user_id:\r\n    tipo: entero\r\n    descripci\u00f3n: El user_id que hizo el pedido\r\n    datos:\r\n      build: faker.random.arrayElement(documents.Users).user_id;\r\n  fecha_pedido\r\n    type: integer\r\n    descripci\u00f3n: Hora en la que se realiz\u00f3 el pedido\r\n    datos:\r\n      build: new Date(faker.date.past()).getTime()\r\n  estado_pedido\r\n    tipo: string\r\n    descripci\u00f3n: Estado del pedido\r\n    datos:\r\n      build: faker.random.arrayElement([ 'Pendiente', 'Procesando', 'Cancelado', 'Enviado' ])\r\n  nombre_facturaci\u00f3n\r\n    type: string\r\n    descripci\u00f3n: Nombre de la persona a la que se va a facturar el pedido\r\n    datos:\r\n      build: `${faker.name.firstName()} ${faker.name.lastName()}`\r\n  tel\u00e9fono_facturaci\u00f3n:\r\n    type: string\r\n    descripci\u00f3n: Tel\u00e9fono de facturaci\u00f3n\r\n    datos:\r\n      build: faker.phone.phoneNumber().replace(\/x[0-9]+$\/, '')\r\n  billing_email:\r\n    type: string\r\n    descripci\u00f3n: Correo electr\u00f3nico de facturaci\u00f3n\r\n    datos:\r\n      build: faker.internet.email()\r\n  direcci\u00f3n_de_facturaci\u00f3n_1:\r\n    type: string\r\n    descripci\u00f3n: Direcci\u00f3n de facturaci\u00f3n 1\r\n    datos:\r\n      build: `${faker.address.streetAddress()} ${faker.address.streetSuffix()}`\r\n  billing_address_2:\r\n    type: string\r\n    descripci\u00f3n: Direcci\u00f3n de facturaci\u00f3n 2\r\n    datos:\r\n      build: chance.bool({ probabilidad: 50 }) ? faker.address.secondaryAddress() : null\r\n  localidad_de_facturaci\u00f3n\r\n    tipo: string\r\n    descripci\u00f3n: Ciudad de facturaci\u00f3n\r\n    datos:\r\n      build: faker.address.city()\r\n  regi\u00f3n_de_facturaci\u00f3n\r\n    type: string\r\n    descripci\u00f3n: Regi\u00f3n de facturaci\u00f3n, ciudad, provincia\r\n    datos:\r\n      construcci\u00f3n: faker.address.stateAbbr()\r\n  billing_postal_code:\r\n    tipo: string\r\n    descripci\u00f3n: C\u00f3digo postal de facturaci\u00f3n\r\n    datos:\r\n      build: faker.address.zipCode()\r\n  pa\u00eds_de_facturaci\u00f3n\r\n    type: string\r\n    descripci\u00f3n: Regi\u00f3n, ciudad, provincia de facturaci\u00f3n\r\n    datos:\r\n      valor: US\r\n  nombre_env\u00edo:\r\n    tipo: cadena\r\n    descripci\u00f3n: El nombre de la persona a la que se facturar\u00e1 el pedido\r\n    datos:\r\n      build: `${faker.name.firstName()} ${faker.name.lastName()}`\r\n  direcci\u00f3n_env\u00edo_1:\r\n    tipo: string\r\n    descripci\u00f3n: Direcci\u00f3n de env\u00edo 1\r\n    datos:\r\n      build: `${faker.address.streetAddress()} ${faker.address.streetSuffix()}`\r\n  shipping_address_2:\r\n    tipo: string\r\n    descripci\u00f3n: Direcci\u00f3n de env\u00edo 2\r\n    datos:\r\n      build: chance.bool({ probabilidad: 50 }) ? faker.address.secondaryAddress() : null\r\n  localidad_de_env\u00edo\r\n    tipo: string\r\n    descripci\u00f3n: Ciudad de env\u00edo\r\n    datos:\r\n      build: faker.address.city()\r\n  regi\u00f3n_de_env\u00edo:\r\n    tipo: string\r\n    descripci\u00f3n: Regi\u00f3n de env\u00edo, ciudad, provincia\r\n    datos:\r\n      build: faker.address.stateAbbr()\r\n  shipping_postal_code:\r\n    tipo: string\r\n    descripci\u00f3n: El c\u00f3digo postal de env\u00edo\r\n    datos:\r\n      build: faker.address.zipCode()\r\n  pa\u00eds_de_env\u00edo:\r\n    tipo: string\r\n    descripci\u00f3n: Regi\u00f3n, ciudad, provincia de env\u00edo\r\n    datos:\r\n      valor: US\r\n  m\u00e9todo_env\u00edo:\r\n    tipo: cadena\r\n    descripci\u00f3n: El m\u00e9todo de env\u00edo\r\n    datos:\r\n      build: faker.random.arrayElement([ 'USPS', 'UPS Standard', 'UPS Ground', 'UPS 2nd Day Air', 'UPS Next Day Air', 'FedEx Ground', 'FedEx 2Day Air', 'FedEx Standard Overnight' ]);\r\n  total_env\u00edo:\r\n    tipo: double\r\n    descripci\u00f3n: Total del env\u00edo\r\n    datos:\r\n      build: chance.dollar({ min: 10, max: 50 }).slice(1)\r\n  impuesto:\r\n    tipo: double\r\n    descripci\u00f3n: El total de impuestos\r\n    datos:\r\n      build: chance.dollar({ min: 2, max: 10 }).slice(1)\r\n  art\u00edculos_de_l\u00ednea\r\n    tipo: array\r\n    descripci\u00f3n: Los productos que se pidieron\r\n    art\u00edculos:\r\n      tipo: string\r\n      datos:\r\n        min: 1\r\n        max: 5\r\n        construir: |\r\n         const random = faker.random.arrayElement(documentos.Productos);\r\n         const producto = {\r\n            product_id: random.product_id,\r\n            nombre_visualizaci\u00f3n: random.nombre_visualizaci\u00f3n,\r\n            descripci\u00f3n_corta: random.descripci\u00f3n_corta,\r\n            imagen: random.imagen,\r\n            precio: random.precio_venta || random.precio,\r\n            qty: faker.random.number({ min: 1, max: 5 }),\r\n         };\r\n         sub_total.producto = cantidad.producto * precio.producto;\r\n         return producto;\r\n  gran_total:\r\n    tipo: double\r\n    descripci\u00f3n: Total general del pedido\r\n    datos:\r\n      post_build: |\r\n       let total = this.tax + this.shipping_total;\r\n       for (let i = 0; i &lt; this.line_items.length; i++) {\r\n         total += this.line_items[i].sub_total;\r\n       }\r\n       return chance.dollar({ min: total, max: total }).slice(1);\r\n\r\n<\/pre>\n<p>Y la salida a la consola utilizando el comando:<\/p>\n<pre class=\"lang:default decode:true\">consola fakeit models\/orders.yaml<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5703 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/blog2-example2-1-compressor.gif\" alt=\"blog example2-1\" width=\"800\" height=\"448\" \/><\/p>\n<p>Como se puede ver en la salida de la consola, los documentos se generaron para los modelos Usuarios y Productos, y esos documentos se pusieron a disposici\u00f3n del modelo Pedidos. Sin embargo, se excluyeron de la salida porque todo lo que se pidi\u00f3 que saliera fue el modelo Pedidos.<\/p>\n<p>Ahora que hemos definido 3 modelos con dependencias (Usuarios, Productos y Pedidos), necesitamos ser capaces de generar m\u00faltiples documentos para cada uno de ellos y enviarlos a Couchbase Server. Hasta ahora hemos especificado el n\u00famero de documentos a generar mediante el argumento de l\u00ednea de comandos -count. Podemos especificar el n\u00famero de documentos o un rango de documentos utilizando la propiedad data: en la ra\u00edz del modelo.<\/p>\n<pre class=\"lang:default decode:true\">usuarios.yaml\r\n\r\nnombre: Users\r\ntipo: object\r\nclave: _id\r\ndatos:\r\n  m\u00edn: 1000\r\n  m\u00e1x: 2000<\/pre>\n<pre class=\"lang:default decode:true\">productos.yaml\r\n\r\nnombre: Productos\r\ntipo: object\r\nclave: _id\r\ndatos\r\n  min: 4000\r\n  max: 5000<\/pre>\n<pre class=\"lang:default decode:true\">pedidos.yaml\r\n\r\nnombre: Pedidos\r\ntipo: object\r\nclave: _id\r\ndatos:\r\n  dependencias:\r\n    - products.yaml\r\n    - usuarios.yaml\r\n  m\u00edn: 5000\r\n  m\u00e1x: 6000<\/pre>\n<p>Ahora podemos generar conjuntos aleatorios de modelos de documentos relacionados y enviar esos documentos directamente a Couchbase Server usando el comando:<\/p>\n<pre class=\"lang:default decode:true\">fakeit couchbase --server 127.0.0.1 --bucket ecommerce --verbose models\/\r\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5700 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/blog2-example3-1-compressor.gif\" alt=\"Blog 2 Example 3-1\" width=\"800\" height=\"440\" \/><\/p>\n<h3><strong>Conclusi\u00f3n<\/strong><\/h3>\n<p>Hemos visto a trav\u00e9s de tres sencillos modelos YAML de FakeIt c\u00f3mo podemos crear dependencias entre modelos permitiendo que los datos generados aleatoriamente se relacionen entre modelos y se transmitan a Couchbase Server. Tambi\u00e9n hemos visto c\u00f3mo podemos especificar el n\u00famero de documentos a generar por modelo usando la propiedad data: en la ra\u00edz de un modelo.<\/p>\n<p>Estos modelos pueden ser almacenados en el repositorio de tus proyectos, ocupando muy poco espacio y permitiendo a tus desarrolladores generar las mismas estructuras de datos con datos completamente diferentes. Otra ventaja de poder generar documentos a trav\u00e9s de relaciones multimodelo es explorar diferentes modelos de documentos y ver c\u00f3mo se comportan con varias consultas N1QL.<\/p>\n<h4><strong>A continuaci\u00f3n<\/strong><\/h4>\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-3-5-lean-models-through-definitions\/\">FakeIt Series 3 de 5: Modelos Lean a trav\u00e9s de definiciones<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-working-existing-data\/\">FakeIt Series 4 de 5: Trabajar con datos existentes<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-5-5-rapid-mobile-development-sync-gateway\/\">FakeIt Series 5 de 5: Desarrollo m\u00f3vil r\u00e1pido con Sync-Gateway<\/a><\/li>\n<\/ul>\n<h4><strong>Anterior<\/strong><\/h4>\n<ul>\n<li>FakeIt Serie 1 de 5: <a href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-generating-fake-data\/\">Generaci\u00f3n de datos falsos<\/a><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-2966 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/brand.devCommChampionLogo.champion.FINAL_-300x300.png\" alt=\"Couchbase Champion\" width=\"300\" height=\"300\" \/>\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/community\/community-writers-program\/\"><em>Este post forma parte del Programa de Escritura de la Comunidad Couchbase<\/em><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Hay montones de generadores de datos aleatorios disponibles, una simple b\u00fasqueda en Google le dar\u00e1 m\u00e1s que suficiente para elegir. Sin embargo, casi todos ellos tienen el mismo defecto frustrante: s\u00f3lo pueden trabajar con un \u00fanico modelo. Rara vez como desarrolladores tenemos el lujo de tratar con un solo modelo, m\u00e1s a menudo que no estamos desarrollando contra m\u00faltiples modelos para nuestros proyectos. Aqu\u00ed es donde FakeIt se destaca, que permite m\u00faltiples modelos y los modelos que tienen dependencias.<\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1819],"tags":[1883,1884],"ppma_author":[9026],"class_list":["post-2953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-data-modeling","tag-data-modelling","tag-document-patterns"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FakeIt Series 2 of 5: Shared Data and Dependencies - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-shared-data-dependencies\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FakeIt Series 2 of 5: Shared Data and Dependencies\" \/>\n<meta property=\"og:description\" content=\"There are tons of random data generators available, a simple Google Search will give you more than enough to choose from. However, almost all of these have the same frustrating flaw, which is they can only ever deal with a single model. Rarely as developers do we have the luxury of dealing with a single model, more often than not we are developing against multiple models for our projects. This is where FakeIt stands out, it allows for multiple models and those models to have dependencies.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-shared-data-dependencies\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-16T13:58:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-19T10:19:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"FakeIt Series 2 of 5: Shared Data and Dependencies\",\"datePublished\":\"2017-03-16T13:58:49+00:00\",\"dateModified\":\"2023-06-19T10:19:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/\"},\"wordCount\":1058,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"data modelling\",\"document patterns\"],\"articleSection\":[\"Couchbase Server\",\"Data Modeling\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/\",\"name\":\"FakeIt Series 2 of 5: Shared Data and Dependencies - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-03-16T13:58:49+00:00\",\"dateModified\":\"2023-06-19T10:19:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FakeIt Series 2 of 5: Shared Data and Dependencies\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"FakeIt Series 2 de 5: Datos compartidos y dependencias - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-shared-data-dependencies\/","og_locale":"es_MX","og_type":"article","og_title":"FakeIt Series 2 of 5: Shared Data and Dependencies","og_description":"There are tons of random data generators available, a simple Google Search will give you more than enough to choose from. However, almost all of these have the same frustrating flaw, which is they can only ever deal with a single model. Rarely as developers do we have the luxury of dealing with a single model, more often than not we are developing against multiple models for our projects. This is where FakeIt stands out, it allows for multiple models and those models to have dependencies.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/fakeit-series-shared-data-dependencies\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-03-16T13:58:49+00:00","article_modified_time":"2023-06-19T10:19:59+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/aaronb-benton-headshot_1000x1000-300x300.jpg","type":"","width":"","height":""}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"FakeIt Series 2 of 5: Shared Data and Dependencies","datePublished":"2017-03-16T13:58:49+00:00","dateModified":"2023-06-19T10:19:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/"},"wordCount":1058,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["data modelling","document patterns"],"articleSection":["Couchbase Server","Data Modeling"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/","url":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/","name":"FakeIt Series 2 de 5: Datos compartidos y dependencias - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-03-16T13:58:49+00:00","dateModified":"2023-06-19T10:19:59+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/fakeit-series-shared-data-dependencies\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FakeIt Series 2 of 5: Shared Data and Dependencies"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","author_category":"","last_name":"Czajkowski","first_name":"Laura","job_title":"","user_url":"","description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2953"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2953"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}