<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Shanika Wickramasinghe</title>
    <description>The latest articles on Forem by Shanika Wickramasinghe (@shanikanishadhi).</description>
    <link>https://forem.com/shanikanishadhi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F209402%2Fdb05ee7a-c83b-424c-922a-451bc6e97e63.jpg</url>
      <title>Forem: Shanika Wickramasinghe</title>
      <link>https://forem.com/shanikanishadhi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/shanikanishadhi"/>
    <language>en</language>
    <item>
      <title>What’s an Example of Good E-Commerce Database Design?</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Sun, 18 Apr 2021 18:02:06 +0000</pubDate>
      <link>https://forem.com/fabric_commerce/what-s-an-example-of-good-e-commerce-database-design-3e9l</link>
      <guid>https://forem.com/fabric_commerce/what-s-an-example-of-good-e-commerce-database-design-3e9l</guid>
      <description>&lt;h1&gt;
  
  
  What's an Example of Good E-Commerce Database Design?
&lt;/h1&gt;

&lt;p&gt;Databases are vital tools for storing, managing and retrieving information, and they are critical for building an e-commerce system. A well-structured database is the heart of a good e-commerce system that manages all the interactions of the system.&lt;/p&gt;

&lt;p&gt;A good e-commerce database design should include the following characteristics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple and Functional Database Structure&lt;/strong&gt;&lt;br&gt;
The database table structure should be relatively simple but needs to cover all the required functionality without compromising the user experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High Performance&lt;/strong&gt;&lt;br&gt;
The database queries should execute fastly and efficiently to facilitate live customer interactions and provide a satisfactory shopping experience. Therefore, the selected database should consist of good indexing and performance optimization options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High Availability and Scalability&lt;/strong&gt;&lt;br&gt;
A good database design should be highly available with automatic snapshots and enable automatic scaling to support future platform growth as well as sudden traffic spikes.&lt;/p&gt;

&lt;p&gt;Based on the above characteristics, an e-commerce database design boils down into three major aspects as the following.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; The Scope of the Database.&lt;/li&gt;
&lt;li&gt; Type of the Database.&lt;/li&gt;
&lt;li&gt; Database Infrastructure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The scope refers to the planned functionality of the database. The underlying table structure of the database, its relationships, and indexes all depend on the functionality of the e-commerce platform. The database type can vary from a relational database to a NoSQL database or a hybrid approach depending on the requirements and the underlying data structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scope of the Database.
&lt;/h2&gt;

&lt;p&gt;The main consideration when designing the database is identifying the functionalities offered by the e-commerce platform. These functionalities can be further divided as core-functions and extra-functions (additional-functions).&lt;/p&gt;

&lt;p&gt;Core-functions are the functions that are necessary for facilitating the day-to-day operations of the e-commerce platform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  User Management&lt;/li&gt;
&lt;li&gt;  Product/Inventory Management&lt;/li&gt;
&lt;li&gt;  Shopping Cart Function &lt;/li&gt;
&lt;li&gt;  Payment Management
&lt;/li&gt;
&lt;li&gt;  Shipping/Logistics Management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Extra/Additional functions are the nice-to-have functions for the e-commerce platform that will enhance the user experience for both end-users (customers) and administrators (business). Following are some functions that come under this category.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Marketing Functions&lt;/li&gt;
&lt;li&gt;  Help Desk/Support&lt;/li&gt;
&lt;li&gt;  Advanced Analytics
&lt;/li&gt;
&lt;li&gt;  Third-Party Integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Database Structure for Core-Functions
&lt;/h2&gt;

&lt;p&gt;In this section, let's see how to structure the database to facilitate the core functions. The below table structure is an example of a database design that covers the core functionality of an e-commerce platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fecommerce-platform-data-1.png%3Fwidth%3D1331%26name%3Decommerce-platform-data-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fecommerce-platform-data-1.png%3Fwidth%3D1331%26name%3Decommerce-platform-data-1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This example covers all the basics of an e-commerce platform. There, the table fields and indexes depend on the design of the overall platform, and it contains three separate sections for user management, product management, and shopping process. Let's have a closer look at each section.&lt;/p&gt;

&lt;h3&gt;
  
  
  User Management
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fuser-table-ecommerce-2.png%3Fwidth%3D561%26name%3Duser-table-ecommerce-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fuser-table-ecommerce-2.png%3Fwidth%3D561%26name%3Duser-table-ecommerce-2.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have created a user table that contains all the user details along with user_payment and user_address tables to store multiple addresses and payment details of users. This structure offers more granular control over data while eliminating duplicate records.&lt;/p&gt;

&lt;p&gt;Another way to manage users is by creating two separate user tables for end-users and administrators and assigning relationships according to their requirements, as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fuser-administrator-ecommerce-table-3.png%3Fwidth%3D1157%26name%3Duser-administrator-ecommerce-table-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fuser-administrator-ecommerce-table-3.png%3Fwidth%3D1157%26name%3Duser-administrator-ecommerce-table-3.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Product Management
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fproduct-management-ecommerce-table-4.png%3Fwidth%3D618%26name%3Dproduct-management-ecommerce-table-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fproduct-management-ecommerce-table-4.png%3Fwidth%3D618%26name%3Dproduct-management-ecommerce-table-4.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Managing products is not simply about maintaining a list of products. You also have to manage the inventory, discounts, categories, and other attributes of the products. So, always focus on simplifying the data structure while reducing duplicates. In the above table structure, the main product table contains information about the products.&lt;/p&gt;

&lt;p&gt;There are two other separate tables called discount, product_inventory, and product_category that are connected to it through database relationships. This approach provides the greatest level of flexibility to the database. For instance, we can simply query the product_inventory table to check for inventory without going through all the data associated with other related tables. This is also a good place to utilize indexes to increase the performance of the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopping Process
&lt;/h3&gt;

&lt;p&gt;This is the most critical and complex part when it comes to designing the database. The shopping process will guide a user to search the products, add the desired products to the shopping cart, and finally complete the transaction using a payment provider.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fshopping-process-ecomerce-data-table-5.png%3Fwidth%3D1100%26name%3Dshopping-process-ecomerce-data-table-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2Fshopping-process-ecomerce-data-table-5.png%3Fwidth%3D1100%26name%3Dshopping-process-ecomerce-data-table-5.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The heart of the e-commerce process connects users with products. A good chunk of design effort should be exhausted to streamline the shopping process. In the above example, there are shopping_session and cart_item as temporary data stores that only store the shopping session information of the current user until the order is confirmed and the data is moved to permanent storage tables with the payment details. (order_details, order_items, and payment details.). You can check out this article for a detailed explanation of how to design a shopping cart database.&lt;/p&gt;

&lt;p&gt;As shown in this section, the scope of the database structure is determined by the overall functionality of the platform. Therefore, it is paramount that you properly define the required functionality before diving into designing the database. This way, you can create a clearly defined data structure with enough flexibility to support future expansions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type of the Database
&lt;/h2&gt;

&lt;p&gt;The next consideration is to determine the type of database. To have the best e-commerce database design, you must first consider two main database types: RDBMS or NoSQL databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relational database:&lt;/strong&gt; This is similar to spreadsheets and uses tables, columns, and rows to organize and retrieve data. It is built using the standard query language (SQL), and all the data is related to each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; MySQL, PostgreSQL, MariaDB, Microsoft SQL, Amazon RDS, Azure SQL Database&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-relational or NoSQL database:&lt;/strong&gt; This is a nontabular database with a flexible schema that works well for storing unstructured data. Contrary to its name, a non-relational database can store related data. It does so by nesting related data within a single data structure instead of splitting them between tables. There are various NoSQL databases, and the most popular ones are document stores and key stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; MongoDB, Apache Cassandra, Amazon DynamoDB, Azure CosmosDB, Couchbase.&lt;/p&gt;

&lt;p&gt;Both these database types are solid options for any e-commerce platform, and the choice is up to the designer and depends on the requirements of the platform. A relational database will provide a simple and robust platform to create the database, while NoSQL offers better data flexibility, scalability, and slightly better performance. In the coming section, we'll explore an example of e-commerce database design for each type.&lt;/p&gt;

&lt;h3&gt;
  
  
  E-Commerce Database Design Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Relational Database Design
&lt;/h4&gt;

&lt;p&gt;Many e-commerce sellers use a relational database design centered around the following tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Products table&lt;/li&gt;
&lt;li&gt;  Customers/Users table&lt;/li&gt;
&lt;li&gt;  Orders table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional tables can be added as required to support shipping, categories, product reviews, etc. We have covered the database structure in the previous section, where the scope of the database was defined.&lt;/p&gt;

&lt;p&gt;Below, you can see a diagram of a simple e-commerce database design built using MySQL.&lt;/p&gt;

&lt;p&gt;MySQL e-commerce database design&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2FMySQL%2520e-commerce%2520database%2520design%25206%2520.png%3Fwidth%3D753%26name%3DMySQL%2520e-commerce%2520database%2520design%25206%2520.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2FMySQL%2520e-commerce%2520database%2520design%25206%2520.png%3Fwidth%3D753%26name%3DMySQL%2520e-commerce%2520database%2520design%25206%2520.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While a standard relational database design will work for many e-commerce stores, there are situations where it is advantageous for retailers to follow another approach.&lt;/p&gt;

&lt;h4&gt;
  
  
  NoSQL database design
&lt;/h4&gt;

&lt;p&gt;Most of the world's largest online retailers, including Walmart and eBay, use NoSQL databases to power their e-commerce systems. The reason is NoSQL databases providing the required performance and scalability to effectively manage large catalogs and unstructured data like user data and images.&lt;/p&gt;

&lt;p&gt;A good example of an e-commerce database built using NoSQL technology is CouchBase, which uses a document store as its database type. With a document database, data is simpler and easier to access as an entire product can be stored in a single document instead of storing across multiple tables.&lt;/p&gt;

&lt;p&gt;Below, you can see an example of data modeling for different products with CouchBase's NoSQL database.&lt;/p&gt;

&lt;p&gt;CouchBase NoSQL data structure&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2FCouchBase%2520NoSQL%2520data%2520structure%25207.png%3Fwidth%3D784%26name%3DCouchBase%2520NoSQL%2520data%2520structure%25207.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2FCouchBase%2520NoSQL%2520data%2520structure%25207.png%3Fwidth%3D784%26name%3DCouchBase%2520NoSQL%2520data%2520structure%25207.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://info.couchbase.com/rs/302-GJY-034/images/Database_design_retail_inventory_product_catalogs.pdf" rel="noopener noreferrer"&gt;source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid Database
&lt;/h3&gt;

&lt;p&gt;Another exciting option is to use a combined solution utilizing an RDBMS for structured data such as user details, order details, payment details, and a NoSQL database for unstructured data such as product details or marketing information.&lt;/p&gt;

&lt;p&gt;Hybrid database structure&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2FHybrid%2520ecommerce%2520database%2520structure%25208%2520.png%3Fwidth%3D394%26name%3DHybrid%2520ecommerce%2520database%2520structure%25208%2520.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresources.fabric.inc%2Fhs-fs%2Fhubfs%2FHybrid%2520ecommerce%2520database%2520structure%25208%2520.png%3Fwidth%3D394%26name%3DHybrid%2520ecommerce%2520database%2520structure%25208%2520.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a Hybrid database structure is relatively more complex than using traditional database types (RDBMS or NoSQL) as a hybrid approach will utilize the application to combine data from both sources. This allows the developer to combine the strengths of both database types. However, this kind of approach is only suitable for truly complex application architectures that offer users a myriad of functions. For instance, if your purpose is to speed up an RDBMS, it's easier to configure a caching server such as Memcached rather than going for a hybrid approach.&lt;/p&gt;

&lt;h1&gt;
  
  
  Database Infrastructure
&lt;/h1&gt;

&lt;p&gt;It is possible to select a database type and design the data structure, but we also need infrastructure to run the database. It depends on the deployment of the e-commerce platform. One option is to provision a server, install the database software and then manage all the aspects from security to maintenance. The other option is to use a managed database service like Amazon RDS, Azure SQL for RDBMS, Amazon DynamoDB, or Azure CosmosDB for NoSQL. Among these two options, the managed approach saves time and does not require any maintenance as these are SaaS offerings.&lt;/p&gt;

&lt;p&gt;Suppose you need complete control over your data, database configurations, and server security policies or deploy the database on a private network. In that case, the only option is to configure and maintain the database manually. However, with more and more businesses utilizing cloud providers nowadays, the best option would be to use a managed database. It is more applicable for an e-commerce platform where scalability and availability play a vital role in the success of the platform. So, it's almost always advisable to use a SaaS database.&lt;/p&gt;

&lt;p&gt;A managed database will offer peace of mind for any developer as it is backed by a reputed cloud provider with a service level agreement to provide maximum uptime. It will also enable the developer/administrators to focus more on creating and optimizing the database without dealing with server or database maintenance. A slight downside of a managed platform would be the higher cost associated with it when compared to managing own servers. However, when considering the total cost of ownership (TCO) and operational expenditure (OpEx), a SaaS solution is the ideal option for a growing e-commerce database.&lt;/p&gt;

&lt;h2&gt;
  
  
  PIM Software for Multichannel Sellers
&lt;/h2&gt;

&lt;p&gt;Product Information Management (PIM) is a critical component of the core functionality of any good e-commerce platform. It provides a flexible solution for managing all your product data inside a single database in the cloud. Moreover, PIM is an excellent option for retailers looking to sell on multiple channels. Having a centralized database in the cloud, PIM allows easy management and delivery of product information to other marketplaces.&lt;/p&gt;

&lt;p&gt;Another main advantage of PIM is the ability to collect and organize data in a variety of formats. Different platforms have their own catalog structure, and PIM automatically sends data to these channels in the proper format.&lt;/p&gt;

&lt;p&gt;Fabric's PIM is one of the best examples of e-commerce database design using PIM software. It serves as a single source for centralizing all your data in the cloud, allowing businesses to benefit from increased productivity while ensuring all information is accurate and up to date across various channels.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>database</category>
      <category>sql</category>
      <category>nosql</category>
    </item>
    <item>
      <title>How Do You Design a Shopping Cart Database for E-Commerce?</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Fri, 16 Apr 2021 00:07:11 +0000</pubDate>
      <link>https://forem.com/fabric_commerce/how-do-you-design-a-shopping-cart-database-for-e-commerce-4oeh</link>
      <guid>https://forem.com/fabric_commerce/how-do-you-design-a-shopping-cart-database-for-e-commerce-4oeh</guid>
      <description>&lt;p&gt;An e-commerce shopping cart serves as a virtual cart that allows customers to add and hold items until they complete the purchase. It accepts payments of customers, organizes and distributes all order information to the merchant, customer, and other relevant parties.&lt;/p&gt;

&lt;p&gt;This process requires a database to store and retrieve the relevant data while supporting the functionality of the shopping cart. A shopping cart database will contain all the critical information about products, orders, and customers and allow users to perform real-time changes reflected in their shopping session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the Database
&lt;/h2&gt;

&lt;p&gt;A shopping cart database should be highly available, fault-tolerant, and highly responsive to provide customers a smooth shopping experience 24x7. When designing a shopping cart database, it &lt;strong&gt;can be divided into three main components&lt;/strong&gt; for better categorization and understanding of the underlying data structure.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Static Data&lt;/li&gt;
&lt;li&gt; Session Data&lt;/li&gt;
&lt;li&gt; Processed Data&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Static Data
&lt;/h4&gt;

&lt;p&gt;This component will include somewhat static data that the customer needs only to retrieve while interacting with a shopping cart. The data is stored in the following types of tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;product&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;discount&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user&lt;/code&gt; table&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Session Data
&lt;/h4&gt;

&lt;p&gt;This is the most important component of the shopping cart database where all the live interactions (session details) are stored when the client is interacting with the shopping cart.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopping_session&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cart_item&lt;/code&gt; table&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Processed Data
&lt;/h4&gt;

&lt;p&gt;Once the customer completes a transaction, we need to permanently store the order information by moving the Session Data into permanent storage. Additionally, we need to store the payment details.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;order_details&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;order_items&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;payment_details&lt;/code&gt; table&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Table Relationships in Database
&lt;/h2&gt;

&lt;p&gt;The following diagram demonstrates the relationships within the above-mentioned tables inside the database using a sample fieldset. The fields in the tables may depend on the requirements of the specific e-commerce platform and can range from a simple to complex list of fields.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Ftable-relationships-ecommerce-database.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Ftable-relationships-ecommerce-database.png" alt="Table relationships in an e-commerce database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When designing the database, we need to have a good balance between simplicity and covering the required functionality.&lt;/p&gt;

&lt;p&gt;Let's dig a bit deeper into the structure of the shopping cart database.&lt;/p&gt;

&lt;h4&gt;
  
  
  Static Data Component
&lt;/h4&gt;

&lt;p&gt;In a shopping cart, tables like product and discount are only required to reference the product, inventory, and pricing details. They will only get &lt;code&gt;SELECT&lt;/code&gt; queries when a customer adds an item to the shopping cart. The only time the product table gets updated is when a purchase is completed and needs to update the inventory of the products (&lt;code&gt;UPDATE&lt;/code&gt; statement). Regular updates for these tables are made by the administrators of the &lt;a href="https://resources.fabric.inc/blog/open-source-ecommerce-platforms" rel="noopener noreferrer"&gt;e-commerce platform&lt;/a&gt; and should be a part of the &lt;a href="https://resources.fabric.inc/glossary/pim" rel="noopener noreferrer"&gt;product information management system&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The user table is only needed in the shopping cart to link the orders and sessions with the registered users. This allows the e-commerce platform to map the orders with the relevant users. The user details table is updated only when a new user is created, or when a user updates their details. This functionality is out of the scope of the shopping cart. Within the shopping cart, we only map the order/session with the user.&lt;/p&gt;

&lt;p&gt;Since we only retrieve the data and limit write queries to updating inventory, the product table is considered a static data component in the shopping cart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Table Structure (Product Table)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;    &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`shopping_cart`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`product`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;`id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`name`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`desc`&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`SKU`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`category`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`price`&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`discount_id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`created_at`&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`modified_at`&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="nv"&gt;`prod_index`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BTREE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="nv"&gt;`sku_index`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;`SKU`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BTREE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="nv"&gt;`fk_prod_discount`&lt;/span&gt;
            &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`discount_id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;`shopping_cart`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`discount`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;InnoDB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Session Data
&lt;/h4&gt;

&lt;p&gt;This component contains the highly active tables within the database, facilitating the real-time functionalities of the shopping cart. The purpose of the &lt;code&gt;shopping_session&lt;/code&gt; and &lt;code&gt;cart_item&lt;/code&gt; tables is to act as highly efficient and temporary storage to support the live interactions of a customer with the shopping cart. When a customer visits the e-commerce platform, a session is created (&lt;code&gt;shopping_session&lt;/code&gt;), and each item added to the cart is captured in the &lt;code&gt;cart_item&lt;/code&gt; table linked to the specific session.&lt;/p&gt;

&lt;p&gt;This enables us to capture the state of the shopping cart regardless of the customer interactions in the e-commerce platform. Combining these details with website cookies enables us to provide previous shopping cart details even if the customer navigates out of the e-commerce platform.&lt;/p&gt;

&lt;p&gt;A considerable architectural effort is required to streamline these tables to support all kinds of live queries (SELECT, UPDATE, DELETE) made to the database without hindering the user experience. This data set also allows the retailers to understand any inefficiencies in their shopping experience by identifying the behavioral patterns of the customers. For example, if some customers are dropping out at the payment stage, the platform developers can drill down and identify any issues with the payment processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Table Structure (&lt;code&gt;shopping_session&lt;/code&gt; table)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;    &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`shopping_cart`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`shopping_session`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;`id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`user_id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`total`&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'0.00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`created_at`&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`modified_at`&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="nv"&gt;`session_index`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;`user_id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BTREE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="nv"&gt;`fk_shopping_user`&lt;/span&gt;
            &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`user_id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;`shopping_cart`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`user`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;InnoDB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Processed Data
&lt;/h4&gt;

&lt;p&gt;The processed data contains the completed order details with the associated payment details. When a transaction is completed, we move the relevant data set from the &lt;code&gt;shopping_session&lt;/code&gt; to &lt;code&gt;order_details&lt;/code&gt; table and &lt;code&gt;cart_item&lt;/code&gt; to order_item table and delete those records from the shopping_session and cart_item tables as they are no longer needed.&lt;/p&gt;

&lt;p&gt;We can use a single table group (&lt;code&gt;shopping_session/cart_item&lt;/code&gt; or &lt;code&gt;order_details/cart_item&lt;/code&gt;) with an extra field (e.g. &lt;code&gt;order_status&lt;/code&gt;) to indicate whether the order has been completed. However, this will create a bloated data set and negatively impact the performance of the e-commerce platform.&lt;/p&gt;

&lt;p&gt;By separating the data into two distinct groups, we can keep track of the completed order in a separate table. This method allows maintaining the history of the orders while reducing the load of the &lt;code&gt;shopping_session&lt;/code&gt; and &lt;code&gt;cart_item&lt;/code&gt; tables to only contain data that needs to facilitate live interactions.&lt;/p&gt;

&lt;p&gt;The combination of &lt;code&gt;order_details&lt;/code&gt; and the &lt;code&gt;order_item&lt;/code&gt; tables with the &lt;code&gt;payment_details&lt;/code&gt; table creates the complete order details and enables the e-commerce platform to arrange the post-processing and distribution of the products or services.&lt;/p&gt;

&lt;p&gt;Another advantage of the processed data component is that it can be used for analytics purposes. Matching the data with relevant users of the e-commerce platform enables us to provide suggestions based on previous purchases and carry out targeted marketing campaigns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Table Structure (order_details table)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;    &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`order_details`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;`id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`user_id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nv"&gt;`total`&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`payment_id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`created_at`&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;`modified_at`&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="nv"&gt;`order_index`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BTREE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="nv"&gt;`customer_order_index`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;`user_id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BTREE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="nv"&gt;`fk_shopping_user_order`&lt;/span&gt;
            &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`user_id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;`shopping_cart`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`user`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="nv"&gt;`fk_order_payment`&lt;/span&gt;
            &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`payment_id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;`shopping_cart`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`payment_details`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
            &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;InnoDB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expanding the Scope of the Database
&lt;/h2&gt;

&lt;p&gt;Shopping cart databases are only a single part of a vast e-commerce experience. This section will briefly explain how to extend the database to cover additional functionalities by introducing new tables and fields to the existing database.&lt;/p&gt;

&lt;h4&gt;
  
  
  User Details
&lt;/h4&gt;

&lt;p&gt;A User table can be extended with other tables such as &lt;code&gt;user_address&lt;/code&gt; and &lt;code&gt;user_payment&lt;/code&gt; to store user preferences. Thus, it enables a smooth shopping experience by providing the stored details of the user for a faster checkout process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Fstored-user-details-faster-checkout.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Fstored-user-details-faster-checkout.png" alt="stored-user-details-faster-checkout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Product Details
&lt;/h4&gt;

&lt;p&gt;Combining additional tables like inventory and category to the products table enables us to expand the functionality of product management. This is a key consideration when expanding the e-commerce platform to integrate &lt;a href="https://fabric.inc/pim" rel="noopener noreferrer"&gt;Product Information Management (PIM)&lt;/a&gt; functionalities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Fproduct-inventory-category-detail-tables.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Fproduct-inventory-category-detail-tables.png" alt="product-inventory-category-detail-tables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A shopping cart database can be extended further to support any requirement. The database can act as a standalone database powering the complete e-commerce platform or a part of a database cluster focused on shopping cart functionality. The possibilities are limited only by the development effort and the user requirements.&lt;/p&gt;

&lt;p&gt;In all instances, it is advisable to decouple the tables and create separate tables other than creating a few large tables. This increases the flexibility and the overall performance of the database while reducing data redundancy.&lt;/p&gt;

&lt;p&gt;As an additional note, it's a good idea to plan a reliable backup and disaster recovery strategy to the database from the initial deployment of the database. It will increase the resilience of the database and offer peace of mind to the platform administrators.&lt;/p&gt;

&lt;h2&gt;
  
  
  OMS Software and Shopping Cart APIs
&lt;/h2&gt;

&lt;p&gt;Order Management Software (OMS) provides everything needed to receive, track, and fulfill customer orders online. These solutions expose the shopping cart database through an API and allow e-commerce platform administrators to ensure that all order and inventory data is up to date.&lt;/p&gt;

&lt;p&gt;For instance, with &lt;a href="https://fabric.inc/oms" rel="noopener noreferrer"&gt;Fabric OMS&lt;/a&gt;, you can streamline the way of managing orders using a single dashboard and track inventory and orders across multiple channels.&lt;/p&gt;

&lt;p&gt;OMS software also comes with &lt;a href="https://api.fabric.inc/cart/untitled" rel="noopener noreferrer"&gt;shopping cart APIs&lt;/a&gt; that add flexibility to the shopping experience by enabling customers to edit their cart, apply promotional codes, and specify shipping and billing information.&lt;/p&gt;

&lt;p&gt;For example, a user can use &lt;code&gt;PATCH /cart/{cartId}/&lt;/code&gt;items to modify their cart, and the API endpoint is designed to ensure the cart is up to date at any given point. Below, you can see two sample requests for a registered and guest user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registered User (Logged in User)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cartId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;604638499041&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userAuthToken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;6^t@CDm6DY7FZZq3E!0lT3rxb02d7&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;registeredUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;items&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;itemId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1000000122&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;quantity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5e31a1f9fcc2b500089c10e8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sale&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;discount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;extra&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Guest User&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cartId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;604638499041&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userAuthToken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;registeredUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;items&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;itemId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1000000015&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;quantity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LPCUsIdKqZhjHoA1Ok3tMCsc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sale&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;discount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;extra&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;itemId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1002200074&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;quantity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3NXSiwNoKbQxe5pbM9hc10lb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sale&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;discount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;extra&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Order Management System API provides different endpoints that reflect different functionalities. Below are some of the functionalities available through the &lt;a href="https://api.fabric.inc/cart/untitled" rel="noopener noreferrer"&gt;Fabric Cart API&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Merge guest cart with user cart&lt;/li&gt;
&lt;li&gt;Get cart by cartId or userId&lt;/li&gt;
&lt;li&gt;Add Ship-To to line items&lt;/li&gt;
&lt;li&gt;Get cart by Ship-To Id&lt;/li&gt;
&lt;li&gt;Apply/Remove Promo&lt;/li&gt;
&lt;li&gt;Create Bill-To records (billing details)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building vs Buying the Shopping Cart
&lt;/h2&gt;

&lt;p&gt;OMS technology available from e-commerce SaaS vendors like Fabric features robust APIs that provide almost limitless functionality. Designing a shopping cart database using them from the ground up may not be the best use of resources. However, if you want to build a shopping cart database from scratch for one reason or another, this article should point you in the right direction.&lt;/p&gt;

&lt;p&gt;For further assistance, you can check out &lt;a href="https://www.oreilly.com/library/view/access-2013-the/9781449359447/ch01.html" rel="noopener noreferrer"&gt;this guide&lt;/a&gt; on creating a database from start to finish using Microsoft Access and have an in-depth look at &lt;a href="https://resources.fabric.inc/blog/ecommerce-data-model" rel="noopener noreferrer"&gt;data modeling for e-commerce applications&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>The Best Open Source PIM Platforms</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Fri, 16 Apr 2021 00:02:50 +0000</pubDate>
      <link>https://forem.com/fabric_commerce/the-best-open-source-pim-platforms-2a8h</link>
      <guid>https://forem.com/fabric_commerce/the-best-open-source-pim-platforms-2a8h</guid>
      <description>&lt;p&gt;A Product Information Management (PIM) platform is designed to collect and manage product information which is an integral part of any standard e-commerce operation. It acts as a central repository to manage and store all your product data. Another responsibility of a good PIM platform is enriching product data and distributing it through appropriate sales channels.&lt;/p&gt;

&lt;p&gt;An open source PIM platform provides a cost-effective and highly customizable solution to this type of data management and distribution. However, selecting an open source solution requires a good deal of research. It also requires the due diligence of comparing open source PIM platforms with platforms from third party, software-as-a-service (SaaS) providers.&lt;/p&gt;

&lt;p&gt;This article explores some of the best available open source PIM solutions, compares them with one another, and compares them with SaaS options like &lt;a href="https://fabric.inc/pim" rel="noopener noreferrer"&gt;Fabric PIM.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PIM Platforms: Open Source Vs SaaS
&lt;/h2&gt;

&lt;p&gt;When considering a PIM platform, there are two available options. Either go for an open source option or a SaaS option. In this section, let's compare the differences between them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SaaS&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customization&lt;/td&gt;
&lt;td&gt;Yes (Code-Level Customization)&lt;/td&gt;
&lt;td&gt;Yes (Granularity Dependent on Provider)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database Access / Management&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure Configuration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure Maintenance&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup / Configuration Difficulty&lt;/td&gt;
&lt;td&gt;Medium / High&lt;/td&gt;
&lt;td&gt;Low (Out of the Box Solution)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technical Expertise&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low / Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Features&lt;/td&gt;
&lt;td&gt;Community Dependent&lt;/td&gt;
&lt;td&gt;Platform Dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrations&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licensing/ Subscription Fees&lt;/td&gt;
&lt;td&gt;No (Free Solution)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security/Compliance&lt;/td&gt;
&lt;td&gt;Unmanaged (User Responsibility)&lt;/td&gt;
&lt;td&gt;Managed (Provider Responsibility)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;Community-Based&lt;/td&gt;
&lt;td&gt;Dedicated Support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; Open source platforms provide a free solution with a greater level of customization for complex configurations and management requirements. On the other hand, SaaS platforms are a paid solution that enable faster time to value and require less resources to fully utilize.&lt;/p&gt;

&lt;h2&gt;
  
  
  PIM Platforms: Best Open Source Options
&lt;/h2&gt;

&lt;p&gt;In this section, let's go through some popular open source product information management platforms and compare their features. Following is the list of platforms we will compare and briefly review.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pimcore.com/en" rel="noopener noreferrer"&gt;Pimcore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ergonode.com/" rel="noopener noreferrer"&gt;Ergonode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atropim.com/" rel="noopener noreferrer"&gt;AtroPIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.akeneo.com/" rel="noopener noreferrer"&gt;Akeneo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openpim.org/" rel="noopener noreferrer"&gt;OpenPIM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Pimcore&lt;/th&gt;
&lt;th&gt;Ergonode&lt;/th&gt;
&lt;th&gt;AtroPIM&lt;/th&gt;
&lt;th&gt;Akeneo&lt;/th&gt;
&lt;th&gt;OpenPIM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data Modeling / Data Management&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Relationship&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Entities / Variants&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Logic / Custom UI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Import / Export&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Omnichannel Publishing Support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multilingual Support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External Integrations&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Availability&lt;/td&gt;
&lt;td&gt;✅2&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker/K8 Support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium Offering&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; Limited support&lt;/li&gt;
&lt;li&gt; The Pimcore REST API is deprecated since version 6.4 and will be removed from version 7; the Pimcore Datahub is the preferred method for data delivery and consumption using GraphQL&lt;/li&gt;
&lt;li&gt; Implementation/support is available only as a premium option&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pimcore&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FPimcore-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FPimcore-1.png" alt="Pimcore-1"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pimcore, specifically its community edition, is a free product information management platform offered under the Open Source GPLv3 license. It is developed using PHP utilizing the Symphony framework. This platform follows the MVC (Model, View, Controller) pattern in its development and supports a wide range of databases like MariaDB, MySQL, and AWS Aurora.&lt;/p&gt;

&lt;p&gt;What differentiates Pimcore from other platforms is that it is not just a PIM platform. It is also a complete data management and customer experience management solution offering multiple products from PIM, DAM (Digital Asset Management), to DXP (Digital Experience Platform). Pimcore supports deployments such as SMEs, enterprises, and B2B operations, and more than 100000 companies across 56 countries utilize this platform in their day-to-day operations.&lt;/p&gt;

&lt;p&gt;Pimcore is developed with a cloud-first and developer-focused mindset offering a robust and highly extensible platform to manage all the functionality. It supports on-premise, hybrid, and cloud deployments and provides native images for all the major cloud service providers like Azure and AWS. Besides offering a simple REST API, Pimcore has created a separate module called data hub and offers a centralized platform for data delivery and consumption using GraphQL. It increases the functionality of the API and allows developers to interface with external software such as ERP and e-commerce solutions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pimcore/pimcore" rel="noopener noreferrer"&gt;Pimcore GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pimcore/data-hub" rel="noopener noreferrer"&gt;Pimcore Data-Hub GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's look at a sample GraphQL request to obtain a document through the API (Data Hub). All the queries there adhere to the GraphQL structure. The documentation for the data hub is available &lt;a href="https://pimcore.com/docs/data-hub/current/Installation.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;251&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document_page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;fullpath&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;editables&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document_editableDate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="n"&gt;_editableName&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="c"&gt;# unix timestamp&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="c"&gt;# as formatted string&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="n"&gt;formatted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Y-m-d"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;      
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Ergonode&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FErgonode.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FErgonode.png" alt="Ergonode"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Ergonode platform is relatively a newcomer as an open source PIM platform. According to the Ergonode team, it aims to provide the first human-centric PIM platform that supports both retail and B2B businesses. Ergonode is distributed under the OSL-3.0 License and powered by Vue.js and Symfony frameworks.&lt;/p&gt;

&lt;p&gt;The Ergonode architecture is built based on Domain Driven Design Approach adhering to the Command Query Responsibility Segregation (CQRS) and Event Sourcing. This approach has enabled a greater degree of flexibility in developing each module leading to a stable, feature-rich, and extensible platform. Moreover, Ergnode provides product, catalog, and asset management functionality with a robust workflow and user management support.&lt;/p&gt;

&lt;p&gt;The Ergonode platform can be broken down into two main components as the independent backend and the frontend. These two components are connected through the REST API. Due to the headless nature of this platform, it offers increased performance. On top of that, the front end is designed to be easily adapted as a Desktop Progressive Web App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ergonode/frontend" rel="noopener noreferrer"&gt;Ergonode Frontend GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ergonode/backend" rel="noopener noreferrer"&gt;Ergonode Backend GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Ergonode platform supports API requests via &lt;a href="https://axios.nuxtjs.org/" rel="noopener noreferrer"&gt;nuxt/axios&lt;/a&gt; library. Following is a sample javascript API request to get all the product details with a limit of 1000 products ordered by ascending order.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getAll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;$axios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;$axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;languages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;AtroPIM&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FAtroPIM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FAtroPIM.png" alt="AtroPIM"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AtroPIM is a product information management platform based on the AtroCore software platform, which is distributed under the GPL-3.0 license. It is based on EspoCRM and utilizes PHP7, backbone.js, composer, and some Zend framework libraries. This platform is a single-page application (SPA) with an API-driven approach and a service-oriented architecture (SOA).&lt;/p&gt;

&lt;p&gt;This PIM platform is one of the easiest platforms to get the system up and running since it offers many out-of-the-box features encapsulated in a responsive, highly customizable and user-friendly UI. AstroPIM has a multitude of features, such as advanced product management functionality and product data quality management. Another advantage of this platform is that it provides digital asset management (DAM) functionality through its AtroDAM module without depending on other tools or extensions.&lt;/p&gt;

&lt;p&gt;AtroPIM also consists of a wide range of connectors and extensions to extend the functionality and connect with external tools and platforms. Its REST API enables developers to integrate AtroPIM with third-party systems and create specialized applications to meet various user needs such as mobile or hybrid web applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/atrocore/atropim" rel="noopener noreferrer"&gt;AtroPIM GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AtroPIM offers a robust &lt;a href="https://demo.atropim.com/apidocs/index.html" rel="noopener noreferrer"&gt;API&lt;/a&gt;. The following python code block demonstrates a simple API request to obtain asset details.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;entityId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;25&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://atropim.com/AssetCategory/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Akeneo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FAkeneo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FAkeneo.png" alt="Akeneo"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Akeneo PIM community edition is a part of the Akeneo product family, aiming to provide a free and feature-rich product information management platform. It is distributed under the open software license v3.0. This platform leverages the Symfony3 framework with backbone.js and React JS for client-side development. The server side of this platform utilizes Doctrine 2 as ORM, MySQL, and ElasticSearch. The combination of this technology stack leads to a highly scalable, flexible, and adaptable platform.&lt;/p&gt;

&lt;p&gt;With Its global community of over 3,000 active members, the Akeneo community edition is constantly under development to fix bugs, improve performance and implement new features while supporting users to get the best out of the platform.&lt;/p&gt;

&lt;p&gt;The Akeneo marketplace consists of various connectors and extensions developed by the community. They can be used to connect to different applications and add more functionality to the default Akeneo PIM platform. Due to its well-documented and robust API, any developer can easily integrate third-party solutions like DAM, ERP, e-commerce platforms, etc., with the Akeneo PIM platform using the API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akeneo/pim-community-dev" rel="noopener noreferrer"&gt;Akeneo PIM GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Akeneo PIM offers a dedicated &lt;a href="https://github.com/akeneo/api-php-client" rel="noopener noreferrer"&gt;PHP API client&lt;/a&gt; that can be used to interact with the Akeno API. We can utilize this client to query the API easily. The following example shows how to query for a product using user credentials.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="nv"&gt;$clientBuilder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\Akeneo\Pim\ApiClient\AkeneoPimClientBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://akeneo/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$clientBuilder&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;buildAuthenticatedByPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'client_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'secret'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getProductApi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'perfume one'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'identifier'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;OpenPIM&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FOpenPIM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FOpenPIM.png" alt="OpenPIM"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The OpenPIM platform is a simple solution to provide an easy-to-use PIM platform for small to medium businesses. It is an entirely free solution without a commercial version. However, it offers premium support for implementing and configuring the platform.&lt;/p&gt;

&lt;p&gt;OpenPIM is distributed under the Apache-2.0 license and developed using the Vue.js framework. Having the target audience of SMEs, the OpenPIM platform provides all the necessary features such as complete product information management (Data Modeling, Hierarchies, Custom Entries, Relations, etc.) functionality and the ability to create custom actions to quickly get your PIM platform to a production environment.&lt;/p&gt;

&lt;p&gt;One of the interesting features of this platform is the support for the query language. It can be used in PIMInput and PIMRownInput components, creating dashboards, and with an extended search functionality to query the data and configure conditions and filters. This query language is based on the JSON format and supports logical and comparison operators. For more information on this, refer to the &lt;a href="https://www.openpim.org/docs/admin/guide/06_Appendix.html" rel="noopener noreferrer"&gt;OpenPIM documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/openpim" rel="noopener noreferrer"&gt;OpenPIM GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following are a couple of examples of OpenPIM query language.&lt;/p&gt;

&lt;p&gt;Simple query to get an item by name (en refers to the English language)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;product one&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query to specify the logical operator OR to get an item by item type (typeId) or internal item id (id)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OP_or&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0021&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;typeId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;055&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PIM Platforms: Best SaaS Option
&lt;/h2&gt;

&lt;p&gt;The fastest and the simplest way to get a PIM platform up and running is to go for a SaaS solution. It mitigates the complexities encountered when configuring an open source platform and handles all the maintenance and security tasks at the cost of licensing or subscription fees. &lt;/p&gt;

&lt;p&gt;Furthermore, a SaaS solution provides an out-of-the-box experience with all the core features already configured and available to the user. The SaaS solutions might provide advanced features that are not available in community editions, such as analytics that would greatly help your business process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fabric PIM
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FFabric-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2FFabric-2.png" alt="Fabric-2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fabric.inc" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt; is an e-commerce SaaS provider that not only offers a &lt;a href="https://fabric.inc/pim" rel="noopener noreferrer"&gt;PIM platform&lt;/a&gt; but a complete solution to cater to any e-commerce requirement. With its storefront, experience management, subscription, and loyalty management features, Fabric helps to boost the productivity of your business. Additionally, the headless nature and the powerful API of Fabric allow developers to customize the platform to suit user needs.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Top 6 Tools to Test Rest APIs</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Fri, 09 Apr 2021 09:31:07 +0000</pubDate>
      <link>https://forem.com/testerum/top-6-tools-to-test-rest-apis-mob</link>
      <guid>https://forem.com/testerum/top-6-tools-to-test-rest-apis-mob</guid>
      <description>&lt;h2&gt;
  
  
  REST APIs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rest APIs&lt;/strong&gt;  are a vital part of every digital application nowadays. It’s crucial to verify that APIs are working fine before applications are delivered to end-users. Rest APIs testing is carried out manually as well as automatically. When testing Rest APIs, we send various HTTP/S requests using GET, POST, PUT, PATCH, and DELETE methods to ensure that the functionality is working great. Rest APIs testing also includes validating response versus the defined inputs, checking the accuracy of response, and checking HTTP status codes and error codes.&lt;/p&gt;

&lt;p&gt;There are many open source and commercial testing tools that can be used to test Rest APIs. Within this article, let’s analyze the best fit among them for your testing demands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612213-testerum-shadow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612213-testerum-shadow.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testerum
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://testerum.com/" rel="noopener noreferrer"&gt;Testerum&lt;/a&gt; is one of the latest tools in the automation testing field. This tool is free &amp;amp; open-source, and very convenient to use due to its user-friendly UI. It uses behavior-driven development (BDD) to illustrate test scenarios and does not require any programming skills.&lt;/p&gt;

&lt;p&gt;When it comes to testing APIs, the best advantage of Testerum is that you can create complex API flows using it. How Testerum defines HTTP Requests is similar to Postman, but it provides an easy and innovative way that doesn’t require programming knowledge to verify the HTTP Responses.&lt;/p&gt;

&lt;p&gt;The Testerum UI will increase the efficiency and effectiveness of the learning process, allowing newcomers to get started with the tool easily. Ultimately, it will help to reduce the cost of training employees.&lt;/p&gt;

&lt;p&gt;Moreover, Testerum can be integrated with any CI/CD environment. Docker images are available and can be used to run Testerum tests easily in any CI/CD environment. It helps developers to maintain continuous integrations and development without distracting the existing development process. Since Testerum is extensible with all JVM languages, it allows developers and testers to create their own integrations.&lt;/p&gt;

&lt;p&gt;Testerum has a centralized reports server and provides quality reports and statistics about test data and test results. While being an interesting tool, Testurum is still very young in the field and has only a small community around it. There’s also a lack of documentation and online helping community due to its novelty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612216-katalon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612216-katalon.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Katalon Studio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.katalon.com/" rel="noopener noreferrer"&gt;Katalon Studio&lt;/a&gt; is another test automation tool that supports testing Rest APIs. It is a free tool built on Appium and Selenium. However, it’s not open-source and can be run on multiple OSs like Windows, macOS, and Linux. This tool has a moderate learning curve and requires basic programming skills for using it. It can be integrated into CI/CD environments using Docker. Furthermore, it generates reports and statistics about test data. In contrast to Testerum, Katalon has a big community to help with difficulties.&lt;/p&gt;

&lt;p&gt;Some of the most significant advantages of the Katalon Studio are having hundreds of built-in keywords for creating test cases and supporting one of the most powerful assertion libraries, AssertJ, to build fluent assertion with BDD style.&lt;/p&gt;

&lt;p&gt;Katalon also has few downsides, such as the need to have programming skills for testers and buy a training pack to implement the tool in a large team even though it’s a free tool. Finally, it’s not an extensible tool like Testerum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612217-rest-assured.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612217-rest-assured.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rest-Assured
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://rest-assured.io/" rel="noopener noreferrer"&gt;Rest-Assured&lt;/a&gt; is an open-source testing tool built on top of Java. With this tool, users don’t have to write codes from scratch since it has a bunch of baked-in functionalities. It can also be integrated with Maven and CI/CD. On top of that, Rest-Assured supports BDD Given/When/Then syntax so that users don’t need to have much expertise in HTTP to use the tool. That syntax makes code more readable and cleaner.&lt;/p&gt;

&lt;p&gt;Rest-Assured can also be integrated with the serenity automation framework enabling testers to combine both UI and REST tests into one framework and generate reports.&lt;/p&gt;

&lt;p&gt;The most important thing about Rest-Assured is that it has methods to fetch data from every single part of the request and response no matter how complex the JSON structures are. Therefore, this tool is very simple and straightforward.&lt;/p&gt;

&lt;p&gt;However, two main drawbacks of this tool are the need for sound Java programming knowledge to use it and not having an inbuilt report generation facility.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612221-postman.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612221-postman.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; is a scalable API testing tool that can be used for both automated and exploratory testing. This tool supports Windows, macOS, and Linux and has the ability to mock APIs. Furthermore, Postman can be integrated with the CI/CD environment, and developers use it as an API development environment. This tool does not require coding knowledge so that it can be used smoothly by both developers and testers for API testing.&lt;/p&gt;

&lt;p&gt;The run, test, document, and monitoring feature of Postman allows testers to share the knowledge with the team easily. It is done by enabling them to package up all the requests and expected responses and then sharing them with team members. Postman offers extended support for GraphQL requests and schemas. Besides, testers can submit the request as a JSON, text, JavaScript HTML, and XML request as well as form data.&lt;/p&gt;

&lt;p&gt;Apart from the above advantages, Postman also has some downsides. It doesn’t offer a good solution for monitoring test cases. Verifying HTTP responses is very difficult with Postman as it requires advanced programming knowledge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612222-karate.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612222-karate.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Karate DSL
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/intuit/karate" rel="noopener noreferrer"&gt;Karate&lt;/a&gt; is the only open-source tool to combine API test automation, &lt;a href="https://github.com/intuit/karate/blob/master/karate-netty" rel="noopener noreferrer"&gt;mocks&lt;/a&gt;, performance testing, and even &lt;a href="https://github.com/intuit/karate/blob/master/karate-core" rel="noopener noreferrer"&gt;UI automation&lt;/a&gt; into a single, &lt;em&gt;unified&lt;/em&gt; framework. The BDD syntax popularized by Cucumber is language-neutral and easy for even non-programmers. It includes multiple steps with Given/When/Then/And/But syntax. Therefore, users can start testing very quickly without writing step definitions.&lt;/p&gt;

&lt;p&gt;Karate DSL comes with the report generation facility and facilitates configuration switching/staging and multithreaded parallel execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612224-soap-ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdzone.com%2Fstorage%2Ftemp%2F14612224-soap-ui.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SoapUI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.soapui.org/" rel="noopener noreferrer"&gt;SoapUI&lt;/a&gt; is a leading API testing tool designed by SmartBear. It supports data-driven testing and comes as a free as well as a pro version. The Pro version supports native CI/CD integrations and asynchronous testing. It has a very user-friendly GUI and convenient for functional testing as users can test complex scenarios without writing any background scripts. SoapUI also facilitates options for test debugging that lets users monitor the execution step by step.&lt;/p&gt;

&lt;p&gt;However, SoapUI requires programming knowledge to verify API responses and script automation. Therefore, it is very complicated for beginners. Not enabling complex flows for testing is another downside of SoapUI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This article has discovered the top testing tools which help to achieve the best Rest APIs testing performance. Not every testing tool fits your application. Using this, you should be able to select the most suitable testing tool for your demand.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>api</category>
      <category>automation</category>
    </item>
    <item>
      <title>Deploy and Manage PostgreSQL on Kubernetes</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Thu, 01 Apr 2021 15:37:42 +0000</pubDate>
      <link>https://forem.com/arctype/deploy-and-manage-postgresql-on-kubernetes-oni</link>
      <guid>https://forem.com/arctype/deploy-and-manage-postgresql-on-kubernetes-oni</guid>
      <description>&lt;p&gt;PostgreSQL database is an enterprise-grade, open-source object-relational database system focused on providing a highly scalable and robust platform while conforming to SQL standards. Kubernetes is an open-source container orchestration platform designed to be easily deployable in any environment. It enables users to easily deploy and manage containerized applications.&lt;/p&gt;

&lt;p&gt;Utilizing Kubernetes to deploy a PostgreSQL instance allows users to leverage the strengths of both platforms. Furthermore, it enables users to create a highly portable and scalable PostgreSQL instance in a Kubernetes cluster. In this article, we will discuss how to easily deploy a PostgreSQL pod in Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What options are available to deploy PostgreSQL?
&lt;/h2&gt;

&lt;p&gt;When it comes to deploying PostgreSQL on Kubernetes, there are two options. One is to create a Kubernetes deployment from scratch, and the other is to use a helm chart to carry out the deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 01 - Creating deployment configuration from scratch
&lt;/h3&gt;

&lt;p&gt;This option requires the user to set up the ConfigMaps, create and set up persistent storage volumes and then create the PostgreSQL deployment and service. This process involves a higher degree of planning and technical knowledge to get the service up and running. Therefore, only use this option if you have specific requirements that require custom configurations from the ground up.&lt;/p&gt;

&lt;p&gt;Therefore, only use this option if you have specific requirements that require custom configurations such as complex persistent storage configurations, network and security policies, multi cluster connectivity etc...&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 02 - Use a helm chart
&lt;/h3&gt;

&lt;p&gt;Helm charts can be considered a type of package that can be used to easily deploy applications to Kubernetes clusters. These charts can be used in any kind of deployment, from a single pod application to complex applications consisting of multiple pods with different software and services.&lt;/p&gt;

&lt;p&gt;In this article, we will focus on using a helm chart to deploy a PostgreSQL instance. Before that, we should know what Helm is and how to configure Helm in a development environment.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Helm?
&lt;/h1&gt;

&lt;p&gt;Helm is considered as the package manager for Kubernetes. It is an open-source project started with the goal of providing a more efficient way to manage Kubernetes YAML files created when deploying an application.&lt;/p&gt;

&lt;p&gt;Currently, Helm has evolved into a fully-fledged package manager that streamlines the installation, upgrading, dependency management, and configuration of applications on a Kubernetes cluster using simple CLI commands (Helm Client).&lt;/p&gt;

&lt;h2&gt;
  
  
  Helm Architecture
&lt;/h2&gt;

&lt;p&gt;Helm creates packages by creating helm charts that bundle one or more Kubernetes manifests (YAML files). These charts contain all the dependencies of the project and allow users to deploy an application with a single command. Additionally, charts can be versioned so that users can create different configurations for the same helm chart under different versions. &lt;/p&gt;

&lt;h2&gt;
  
  
  Helm is composed of three main concepts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Chart - Contains Information required to create an application instance in Kubernetes &lt;/li&gt;
&lt;li&gt;  Config - Contains the configuration information that can be merged with a chart to create a releasable object.&lt;/li&gt;
&lt;li&gt;  Release - A running instance of a chart, combined with a specific config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Helm executable can be broken down into two components as follows;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Helm Client: A command-line tool used by end-users to create and manage helm charts and interfaces with the Helm library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Helm Library: Interfaces with the Kubernetes API and executes all the helm operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these are written in the Go programming language. To connect with Kubernetes, Helm utilizes the Kubernetes client library using REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install Helm
&lt;/h2&gt;

&lt;p&gt;Before installing Helm, we need to have a Kubernetes cluster configured and running. It is recommended to use the latest stable release of Kubernetes.&lt;/p&gt;

&lt;p&gt;Installing Helm is a simple process. You can use a package manager like Homebrew for Mac, Chocolatey/Scoop for Windows, or apt/Snap for Debian/Ubuntu. Another way to install Helm is by downloading the &lt;a href="https://github.com/helm/helm/releases/tag/v3.5.3" rel="noopener noreferrer"&gt;binary&lt;/a&gt; for the related operating system.&lt;/p&gt;

&lt;p&gt;The following example demonstrates how to install Helm using the chocolatey package manager in a windows environment.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;choco install kubernetes-helm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2Ff-11Tpa0gxoJJpsVvcr1T0NJFg8_QpQjVNH1_lggdIy2NpDktX2LzpzZxvZFLNjKPfOUnWDQsZ9KCVBChEc2cJUEByKci6kc-LgW1THHcXZdW8Q_ESYRlukLvzcaxIH3MT-4MBY" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2Ff-11Tpa0gxoJJpsVvcr1T0NJFg8_QpQjVNH1_lggdIy2NpDktX2LzpzZxvZFLNjKPfOUnWDQsZ9KCVBChEc2cJUEByKci6kc-LgW1THHcXZdW8Q_ESYRlukLvzcaxIH3MT-4MBY"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it, and you have completed installing Helm. Next, let’s verify the installation by checking the helm version using the command below.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2F-EYWdzKyzneOdqwqTgu1_yCaAg9Gp3bnBG4k5HeoOJB3WE30WNDGLS2VlxgH5IvTj-7gAW8kYN36AwVyHRZNg0PKJwH-qaqhpVUyStO7dSgVIPVmtOY465H8PLGw0zfjldr-tO0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2F-EYWdzKyzneOdqwqTgu1_yCaAg9Gp3bnBG4k5HeoOJB3WE30WNDGLS2VlxgH5IvTj-7gAW8kYN36AwVyHRZNg0PKJwH-qaqhpVUyStO7dSgVIPVmtOY465H8PLGw0zfjldr-tO0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Finding Helm Charts
&lt;/h2&gt;

&lt;p&gt;You have the option to create helm charts from scratch. However, there are also prebuilt charts that can be deployed instantly for popular software like PostgreSQL. There, Helm charts are stored and shared using a chart repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://artifacthub.io" rel="noopener noreferrer"&gt;Artifact Hub&lt;/a&gt; is the official distributed community Helm chart repository. For third-party repositories, we need to add the repository to our local environment before we can use it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Available PostgreSQL charts
&lt;/h3&gt;

&lt;p&gt;First, we have to find a suitable PostgreSQL helm chart for deployment. For that, we can search the Artifact Hub using the following command in the CLI interface.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm search hub postgresql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FYn4ZxNK6ZgMKzXzpXX1KfJz3ndPS2gWNU5R3ASEJ0jOrLpvuOwtcBCR5ohiqnAc0mUO1Nl52u0sO8qHXG5gy-3xI5G-cdNexOXvc-E6wa0umrUis_yRmYxuaZKlK3g46uF5pioE" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FYn4ZxNK6ZgMKzXzpXX1KfJz3ndPS2gWNU5R3ASEJ0jOrLpvuOwtcBCR5ohiqnAc0mUO1Nl52u0sO8qHXG5gy-3xI5G-cdNexOXvc-E6wa0umrUis_yRmYxuaZKlK3g46uF5pioE"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above command will search for all the available charts in the Artifact Hub for a PostgreSQL chart. The “hub” parameter points to the Artifact Hub.&lt;/p&gt;

&lt;p&gt;To search in a third-party repository, first, we need to add the repository to our helm installation. It can be done through the “repo add” command. The following example shows how to add the bitnami repository to our helm installation and search for the repository.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm repo add bitnami https://charts.bitnami.com/bitnami&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;helm search repo bitnami&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FEfTcEKBh5XMxGjHR0wFau10it1kbr5K2bUlJH_TPuvVz6snYyzn9f4Z5CeVUWyq1t9DagP6Mou8bcGArJkcgp01BFgnfIou490FiM3S6ir8XDPaNz_9UuVb81KW1KxIwQmtd8GY" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FEfTcEKBh5XMxGjHR0wFau10it1kbr5K2bUlJH_TPuvVz6snYyzn9f4Z5CeVUWyq1t9DagP6Mou8bcGArJkcgp01BFgnfIou490FiM3S6ir8XDPaNz_9UuVb81KW1KxIwQmtd8GY"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above search command, we use the parameter “repo” to carry out the search in the newly added repository apart from the artifact hub. Now let’s search for PostgreSQL instances in this repo using the following command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm search repo postgresql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2Fp96C4iHaDCa8uBhWs7-gL0nmF7aU8suD8xHiRL8aH942pi5nKI5acDKz8vhVw6rHzlsvRu0GDZmry3LXTqmXwb6VJPLEhXZ7vmWW2rvh9ODMPH5Ue_QVeASJRPj0A_PrLGL8egg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2Fp96C4iHaDCa8uBhWs7-gL0nmF7aU8suD8xHiRL8aH942pi5nKI5acDKz8vhVw6rHzlsvRu0GDZmry3LXTqmXwb6VJPLEhXZ7vmWW2rvh9ODMPH5Ue_QVeASJRPj0A_PrLGL8egg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing Helm Charts
&lt;/h2&gt;

&lt;p&gt;By now, we have located a helm chart, and the next step would be to install the chart using the “helm install command,” as shown below.&lt;/p&gt;

&lt;p&gt;Syntax&lt;br&gt;
&lt;code&gt;helm install &amp;lt;Pod Name&amp;gt;  &amp;lt;Chart Name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;code&gt;helm install postgresql-dev bitnami/postgresql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FCGubGKLo__04fCiXV52yw5hDiaGxkxNPn_rnahAj7M476PJnNS43CHTz30yx5mx-VdgWysWdiUXqG1qbBwc9EwA33i4zfirqO6v0rDRy5OVJIf2LrwYBGun-fboJRE8uTLJASS0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FCGubGKLo__04fCiXV52yw5hDiaGxkxNPn_rnahAj7M476PJnNS43CHTz30yx5mx-VdgWysWdiUXqG1qbBwc9EwA33i4zfirqO6v0rDRy5OVJIf2LrwYBGun-fboJRE8uTLJASS0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait till the installation is completed. Then, check the Kubernetes environment, and you will see that a PostgreSQL instance has been deployed successfully.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get all&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2FKePRg-FqAk82-FBTPJbDeA6cm5LMvPXFcnSi_vfTSie-oPwJ_LX5x7Zex_yrxF0-jU574gspZfph9ljjjnwYH_6q41zGS6mYMauZphrFscNF_Iv7LdGhkG04NklOziFgNgVDMT8" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2FKePRg-FqAk82-FBTPJbDeA6cm5LMvPXFcnSi_vfTSie-oPwJ_LX5x7Zex_yrxF0-jU574gspZfph9ljjjnwYH_6q41zGS6mYMauZphrFscNF_Iv7LdGhkG04NklOziFgNgVDMT8"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have deployed a PostgreSQL container. The next step would be to connect to the database, and it can be done using the following commands.&lt;/p&gt;

&lt;p&gt;We need to extract the password of the instance and save it as an environmental variable. That password will be used to create the connection.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql-test -o jsonpath="{.data.postgresql-password}" | base64 --decode)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl run postgresql-test-client --rm --tty -i --restart='Never' --namespace default --image docker.io/bitnami/postgresql:11.11.0-debian-10-r31 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host postgresql-test -U postgres -d postgres -p 5432&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FCNFNeeT9xpoG8GBehHUqa8RI6DtlQiLhzdu7IECib84bnhm26D9wg012EDl3rqm7E1jKHN6_JHRkO2qkggYYuDlfRh-le36HW9ySv5jTmzk0sjy-9kjgineZy09XJM6AHXWKt1Y" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FCNFNeeT9xpoG8GBehHUqa8RI6DtlQiLhzdu7IECib84bnhm26D9wg012EDl3rqm7E1jKHN6_JHRkO2qkggYYuDlfRh-le36HW9ySv5jTmzk0sjy-9kjgineZy09XJM6AHXWKt1Y"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After connecting to the database successfully, we can verify our installation by checking the server version.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuration Options
&lt;/h3&gt;

&lt;p&gt;Depending on the selected helm chart, the available configuration options may differ. The bitnami PostgreSQL chart offers a whole host of options from simple user creation to complex security configurations like setting up certificates and policies. All the available options are listed on the helm chart &lt;a href="https://github.com/bitnami/charts/tree/master/bitnami/postgresql" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's look at some common options, such as changing the username, password, database name, and port. This can be done by providing the following parameters while installing the helm chart.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install postgresql-test01 bitnami/postgresql --set
global.postgresql.postgresqlUsername=testadmin --set
global.postgresql.postgresqlPassword=testadmin123 --set
global.postgresql.postgresqlDatabase=testdb --set
global.postgresql.servicePort=5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2FerZ-DCwhb_z25GDueUNnCvfnErsGmcUl4ZGmxEtE4UJr60wNbw8l6n4TTNrQ0Zx0MrcmLE2rdUUqDDMFD-7AJhnY9bfpIfA_mLL_7z5kTTNkL8G2IfbRt86cRQuxDbLppXzOJfM" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2FerZ-DCwhb_z25GDueUNnCvfnErsGmcUl4ZGmxEtE4UJr60wNbw8l6n4TTNrQ0Zx0MrcmLE2rdUUqDDMFD-7AJhnY9bfpIfA_mLL_7z5kTTNkL8G2IfbRt86cRQuxDbLppXzOJfM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above output indicates that the new port is configured, and a new user is created. If we export the password for the “testadmin” user, it will return the user-defined password.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql-test01 -o jsonpath="{.data.postgresql-password}" | base64 --decode)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FBH_afvPu7DCofbL7knn0TAO2_HzFx9qom27ZappPU9VjVtwX7bf7OvGwXUHCNYElTlwEmEU7DbG5Jm4oFrsGeLFM9vMl49h2K51COXrD1hiFl7G0H45wla52d6LEm5lRXtmAGPU" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FBH_afvPu7DCofbL7knn0TAO2_HzFx9qom27ZappPU9VjVtwX7bf7OvGwXUHCNYElTlwEmEU7DbG5Jm4oFrsGeLFM9vMl49h2K51COXrD1hiFl7G0H45wla52d6LEm5lRXtmAGPU"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another common scenario is to configure persistent storage for PostgreSQL deployment. We need to create persistent storage volume before installing the helm chart. The below code block shows how to create a simple storage volume and a volume claim and then attach it to the PostgreSQL deployment.&lt;/p&gt;

&lt;p&gt;test-pv.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgresql-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;test-pvc.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgresql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the volume and claim&lt;br&gt;
&lt;code&gt;kubectl apply -f test-pv.yaml&lt;/code&gt;&lt;br&gt;
&lt;code&gt;kubectl apply -f test-pvc.yaml&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;kubectl get pvc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FZCXODiK24_si0ndYEkaZybmDNdnzXMT-v6O-sPUrBAhRxBxNid9YYcatD772jMRmS9Xnn9kXnItiNTRWHXW9zml8w2rk-J_Cimh_b0-6ZIkynu2-3lTrxl0DtJENjv1nuaS7cF0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FZCXODiK24_si0ndYEkaZybmDNdnzXMT-v6O-sPUrBAhRxBxNid9YYcatD772jMRmS9Xnn9kXnItiNTRWHXW9zml8w2rk-J_Cimh_b0-6ZIkynu2-3lTrxl0DtJENjv1nuaS7cF0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, we can attach the persistent volume claim to the helm chart using the following command. We will set the “volumePermissions.enabled” to true for mitigating any permission issues that can occur when writing to the storage volume.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install postgresql-test02 bitnami/postgresql --set
persistence.existingClaim=postgresql-pv-claim --set
volumePermissions.enabled=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2FedGbrqBjCGxKhI_AQlVTsWSVUY2k_4cwnTDLPiclKl91-HyqB3uBmcHCgBFJSrgb1zhRhzicYf_-UhIVO38bZZPfxw7uKCZHASPukM03USbMCyPFtXJFWcVt220C7Me0yiqmvZQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2FedGbrqBjCGxKhI_AQlVTsWSVUY2k_4cwnTDLPiclKl91-HyqB3uBmcHCgBFJSrgb1zhRhzicYf_-UhIVO38bZZPfxw7uKCZHASPukM03USbMCyPFtXJFWcVt220C7Me0yiqmvZQ"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Upgrading Helm Chart
&lt;/h2&gt;

&lt;p&gt;When upgrading the PostgreSQL helm, it is essential to provide the existing postgresqlPassword and replication.password parameters. It will ensure these values are not updated with random details, which will lead to an inaccessible database.&lt;/p&gt;

&lt;p&gt;Syntax&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade &amp;lt;Pod Name&amp;gt;  &amp;lt;Chart Name&amp;gt; --set
postgresqlPassword=&amp;lt;POSTGRESQL_PASSWORD&amp;gt; --set
replication.password=&amp;lt;REPLICATION_PASSWORD&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade postgresql-test bitnami/postgresql --set
postgresqlPassword=testadmin123 --set
replication.password=12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FKsjTgWis7XuQ57qEbJ4usyFEjawDwZpe2wnF8rcCpl3YWOPiF8C4lSaGZAGvMcgpDvMribZUI-fmKT3-Sehl4jyLEHCbclLHmPrP9ChZS9wdnk3quPOhRuxsrF6AqXLMOKNoJuQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FKsjTgWis7XuQ57qEbJ4usyFEjawDwZpe2wnF8rcCpl3YWOPiF8C4lSaGZAGvMcgpDvMribZUI-fmKT3-Sehl4jyLEHCbclLHmPrP9ChZS9wdnk3quPOhRuxsrF6AqXLMOKNoJuQ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deleting a Helm Chart
&lt;/h2&gt;

&lt;p&gt;We can simply delete a helm chart by providing the chart name with the delete command, as shown below.&lt;/p&gt;

&lt;p&gt;Syntax&lt;br&gt;
&lt;code&gt;helm delete &amp;lt;Chart Name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;code&gt;helm delete postgresql-test&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FbsEDYTprWP2MEqKWm209x2g1w4D1ESt9-Mkp_CVfKwUOZz1mIiKdDQCdgid90aiZVOW7W5TzHb98xneVFPN7GW_VZNIK63sb6cs6Y9GT40cAJt4eJKclHCDSgGVWZkPbkowdWRw" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FbsEDYTprWP2MEqKWm209x2g1w4D1ESt9-Mkp_CVfKwUOZz1mIiKdDQCdgid90aiZVOW7W5TzHb98xneVFPN7GW_VZNIK63sb6cs6Y9GT40cAJt4eJKclHCDSgGVWZkPbkowdWRw"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, this would not delete any PVC associated with the chart. So we need to delete the unused PVCs manually.&lt;br&gt;
&lt;code&gt;kubectl get pvc&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;kubectl delete pvc data-postgresql-test-postgresql-0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RESULT&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FmuuEfjaa2e1ngJf2kBgY6L-7PAlQ--D4904lMu4YHU_3xcLFt3QFTOqsCDJ7685j93LoGZSetwyfZK95-TT6Lx76uKWNrKHHOu59A5DIM9E8XeW5DcRlcZD4t9p7D0WpRDWSX80" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FmuuEfjaa2e1ngJf2kBgY6L-7PAlQ--D4904lMu4YHU_3xcLFt3QFTOqsCDJ7685j93LoGZSetwyfZK95-TT6Lx76uKWNrKHHOu59A5DIM9E8XeW5DcRlcZD4t9p7D0WpRDWSX80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we learned how to deploy a PostgreSQL database in a Kubernetes cluster using a helm chart, change the configurations, and upgrade and delete the PostgreSQL chart. Using helm charts is a relatively straightforward method to deploy commonly used applications in a Kubernetes cluster. This frees up the users to concentrate on the development of the database without having to create complex Kubernetes configurations.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>postgres</category>
    </item>
    <item>
      <title>The Best Open Source E-Commerce Platforms</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Mon, 29 Mar 2021 14:11:51 +0000</pubDate>
      <link>https://forem.com/fabric_commerce/the-best-open-source-e-commerce-platforms-52ff</link>
      <guid>https://forem.com/fabric_commerce/the-best-open-source-e-commerce-platforms-52ff</guid>
      <description>&lt;p&gt;The world has become more digitally interconnected and the web is the connectivity platform. Online e-commerce platforms are one of the most evolving sectors of the web, with more retailers trying to evolve their online presence or completely shift operations online.&lt;/p&gt;

&lt;p&gt;E-commerce platforms facilitate digital retail and operations. They give businesses greater visibility into e-commerce growth and help teams coordinate merchandising, marketing, sales, and fulfillment efforts across channels.&lt;/p&gt;

&lt;p&gt;Whether you’re a high-growth brand or an established business trying to improve digital sales and experiences, there are dozens of e-commerce platforms to choose from. In this post, we’ll review the best open source e-commerce platforms and list the pros and cons of open source and software-as-a-service options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Vs SaaS E-Commerce Platforms
&lt;/h2&gt;

&lt;p&gt;When selecting an e-commerce platform, one of the main challenges is choosing between an open source and software-as-a-service option. Below we look at the differences between each option. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SaaS&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (Code-Level Customization)&lt;/td&gt;
&lt;td&gt;Yes (Granularity Dependent on Provider)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure  Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup Difficulty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium/High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technical Expertise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low/Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community Dependent&lt;/td&gt;
&lt;td&gt;Platform Dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security and Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unmanaged (User Responsibility)&lt;/td&gt;
&lt;td&gt;Managed (Provider Responsibility)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;External Integrations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licensing/Subscription Fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community Based Support&lt;/td&gt;
&lt;td&gt;Dedicated Support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The main takeaway is that open source options give you complete control but require more resources to configure and maintain; SaaS options take care of these requirements for you while still giving you the ability to create robust backend systems and unique frontend shopping experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source E-Commerce Platforms
&lt;/h2&gt;

&lt;p&gt;In this section, we will go through the best available open source e-commerce platforms and compare their features. The following platforms will be used for the comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.nopcommerce.com/en"&gt;nopCommerce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.shopware.com/en/"&gt;Shopware&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.cubecart.com"&gt;CubeCart&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://sylius.com"&gt;Sylius&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://solidus.io"&gt;Solidus&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;nopCommerce&lt;/th&gt;
&lt;th&gt;Shopware&lt;/th&gt;
&lt;th&gt;CubeCart&lt;/th&gt;
&lt;th&gt;Sylius&lt;/th&gt;
&lt;th&gt;Solidus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Store and Multi-Vendor&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅1&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅6&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅5&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Management&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple Payment Providers&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅2&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shipping/Logistic Management&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrated Marketing/ Analytics&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅5&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3rd Party Integrations/Plugins&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internationalization&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Availability (Headless)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker/K8 Support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅3&lt;/td&gt;
&lt;td&gt;❌4&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium Offering&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;1 - Multi-Vendor is supported via plugins&lt;br&gt;
2 - Direct integration with PayPal and others through plugins&lt;br&gt;
3 - Docker installation is not recommended for macOS due to performance&lt;br&gt;
issues&lt;br&gt;
4 - Third-party docker containers are available&lt;br&gt;
5 - Supported via plugins&lt;br&gt;
6 - Premium Feature&lt;/p&gt;

&lt;h3&gt;
  
  
  nopCommerce
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zzx9LUWC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/nopCommerce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zzx9LUWC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/nopCommerce.png" alt="nopCommerce"&gt;&lt;/a&gt; &lt;a href="https://www.nopcommerce.com/"&gt;nopCommerce&lt;/a&gt; is an ASP.NET-based e-commerce platform released in 2008 with the purpose of providing a feature-rich, free, and open source e-commerce platform. nopCommerce is designed to support SMBs to perform enterprise-level operations.&lt;/p&gt;

&lt;p&gt;nopCommerce is an out-of-the-box solution for all your B2B and B2C commerce needs. It provides a wide array of features such as multi-vendor / multi-store configurations, product management, payment and tax management, and customer services. This platform also supports the widest range of third-party integrations for payment modules, shipping management, marketing, and administration. Another strength is the sheer amount of customization, from simple themes to the customization of individual functions to suit the exact requirements of the user.&lt;/p&gt;

&lt;p&gt;nopCommerce is fully compliant with PCI DSS to provide a secure payment platform to all the integrated payment methods. It meets all the requirements for GDPR compliance in the European Union and actively keeps the compliance up to date as a secure and trustworthy e-commerce platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopware
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bzHfuF58--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Shopware.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bzHfuF58--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Shopware.png" alt="Shopware"&gt;&lt;/a&gt; &lt;a href="https://www.shopware.com/en/"&gt;Shopware&lt;/a&gt; was introduced in 2000 to provide an e-commerce platform that can help businesses move their operations online. The current implementation of Shopware utilizes Twig and Bootstrap to power the storefront while using Vue.js and twig.js to power the administration interface. This open source project is distributed under the MIT license.&lt;/p&gt;

&lt;p&gt;Shopware provides the services through REST APIs and offers rich user interfaces enabling developers and administrators alike to use their preferred method to interact with the platform. This platform is developed using retailer feedback to better cater to user requirements&lt;/p&gt;

&lt;p&gt;Shopware allows users to easily make an online e-commerce presence due to its minimal learning curve and simple and intuitive design. It supports integrations with different sales channels and social media platforms to increase visibility to customers. Both B2C and B2B business modules are supported under this platform. Furthermore, Shopware is designed to be performance-centric and highly scalable. The Plugin Manager functionality of Shopware enables users to extend this e-commerce platform with other tools and services effortlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  CubeCart
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Du6WW9SX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/CubeCart.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Du6WW9SX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/CubeCart.png" alt="CubeCart"&gt;&lt;/a&gt; &lt;a href="https://www.cubecart.com/"&gt;CubeCart&lt;/a&gt; is one of the most straightforward solutions, aiming to provide a stable and secure e-commerce platform. It is a free and open source platform distributed under the GPL 3.0 license, and its security is audited by Netsparker.&lt;/p&gt;

&lt;p&gt;CubeCart is actively developed on a regular basis and is backed by a thriving community. Moreover, it utilizes the Smarty Template Engine to create a template-driven responsive frontend. This platform provides various functionalities such as product, payment, and logistical management to fulfill all your e-commerce needs.&lt;/p&gt;

&lt;p&gt;One of the best features of this platform is its extensive log functionality, from simple transaction logs to server error and request logs. These logs enable the platform administrators to be aware of the complete behavior of the storefront. Furthermore, CubeCart provides inbuilt support for Google Analytics and SEO tools and can be further extended using free and paid extensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sylius
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AEf08xsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Sylius.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AEf08xsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Sylius.png" alt="Sylius"&gt;&lt;/a&gt; &lt;a href="https://sylius.com/"&gt;Sylius&lt;/a&gt; is a headless e-commerce platform targeting mid-market and enterprise customers that require custom e-commerce solutions. It is built on top of the Symfony framework and developed using full stack Behavior-Driven-Development with phpspec and Behat.&lt;/p&gt;

&lt;p&gt;This open source platform is freely available and distributed under the MIT license. Sylius is designed to be the nexus of your e-commerce stack. Due to the headless nature of the platform, developers are given the freedom to build custom interfaces to suit the desired sales channel whether it’s a mobile platform, point of sale kiosk, or a progressive web app.&lt;/p&gt;

&lt;p&gt;Sylius can be used out-of-the-box with its provided functionality or can be integrated into an existing PIM, CRM, or Automation software using the powerful REST API. The platform can be extended further using Sylius plugins which add more functionality from simple content and customization options to complex reporting and analytics features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solidus
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hH_xRNXs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Solidus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hH_xRNXs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Solidus.png" alt="Solidus"&gt;&lt;/a&gt;  The &lt;a href="https://solidus.io/"&gt;Solidus&lt;/a&gt; e-commerce platform is developed using Ruby on Rails. The project started its life as a fork of the &lt;a href="https://spreecommerce.org/"&gt;Spree Commerce platform&lt;/a&gt; and gradually evolved into a fully-featured e-commerce platform.&lt;/p&gt;

&lt;p&gt;This platform is targeted towards digitally native brands and fast-growing online businesses with a high focus on stability, flexibility, and scalability. What sets this platform apart from others is its adherence to the open source mindset. It consists of a well-defined and public roadmap for development and receives transparent funding through the &lt;a href="https://opencollective.com/solidus"&gt;Open Collective Solidus community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Solidus offers both RESTful API and GraphQL API to make a truly headless e-commerce experience. The three main components of Solidus are Product Catalog, Payment, and Logistics. The product section provides inventory and product management, while the payment component manages payment integrations, subscriptions, and taxations. Finally, the logistic management tackles the shipping, returns, and exchanges.&lt;/p&gt;

&lt;h3&gt;
  
  
  E-Commerce Platforms: Best SaaS Option
&lt;/h3&gt;

&lt;p&gt;The best option to gain a truly out-of-the-box experience without worrying about complex configurations or infrastructure would be a SaaS e-commerce solution. SaaS solutions will take care of complex, time-consuming, and mundane tasks such as server management, security patching, and system maintenance, and allow business users to focus on providing the best possible e-commerce experience to customers.&lt;/p&gt;

&lt;p&gt;Among numerous available SaaS solutions is &lt;a href="https://fabric.inc/"&gt;Fabric&lt;/a&gt;, a headless commerce platform&lt;a href="https://fabric.inc/"&gt;.&lt;/a&gt;It offers robust functionality with specialized features such as a Product Information Manager and Order Management System to provide a comprehensive, all-in-one platform.&lt;/p&gt;

&lt;p&gt;It also offers tailored features like &lt;a href="https://fabric.inc/storefront"&gt;Storefront&lt;/a&gt; to fast track development of a digital store and &lt;a href="https://fabric.inc/xm"&gt;Experience Manager&lt;/a&gt; to create user- and channel-specific experiences. Additionally, a fully customizable API enables developers to extend the functionality to match their requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9wJ_qQR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Fabric-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9wJ_qQR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://f.hubspotusercontent00.net/hubfs/6994951/Fabric-1.png" alt="Fabric-1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fabric also offers &lt;a href="https://fabric.inc/services"&gt;a service&lt;/a&gt; to get your application up and running at every stage of the development process. By choosing a SaaS platform like Fabric, you can enjoy all these benefits without having to worry about infrastructure and complex technical considerations.&lt;/p&gt;

&lt;p&gt;The best &lt;a href="https://html-css-js.com/js/"&gt;online JS tools&lt;/a&gt; can be found at HTML-CSS-JS.com: script beautifier, compressor, cheat sheet or just read the blog.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>The Best Open Source Headless CMS Software</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Fri, 19 Mar 2021 02:08:47 +0000</pubDate>
      <link>https://forem.com/fabric_commerce/the-best-open-source-headless-cms-software-23lk</link>
      <guid>https://forem.com/fabric_commerce/the-best-open-source-headless-cms-software-23lk</guid>
      <description>&lt;p&gt;Traditional content management systems (CMS) are built around serving content with a web-oriented framework combining both the &lt;a href="https://resources.fabric.inc/answers/frontend-backend" rel="noopener noreferrer"&gt;frontend and backend&lt;/a&gt;. However, this monolithic approach does not support modern web environments. The headless CMS addresses this issue by providing a decoupled approach to content management.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://resources.fabric.inc/glossary/headless-cms" rel="noopener noreferrer"&gt;headless CMS&lt;/a&gt; provides a backend to manage your content while providing an API to serve the content. This API allows developers to use any presentation layer to effectively display content across multiple channels. It also offers them unlimited options to structure and deliver content.&lt;/p&gt;

&lt;p&gt;If you’re considering using a headless CMS to scale content management across channels, you can choose an open source headless CMS or a headless CMS from a software-as-a-service (SaaS) provider. In this article, we will present the pros and cons of each. We will then present the best open source headless CMS options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Vs. SaaS Headless CMS
&lt;/h2&gt;

&lt;p&gt;Let’s look at the core factors to consider when comparing and contrasting open source and SaaS options for a headless CMS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ease of Implementation
&lt;/h3&gt;

&lt;p&gt;The first consideration is the ease of getting the service up and running. With most open source options, you must set up the infrastructure first and then configure the functionality. Even though this provides a high level of control over your deployment, it’s time consuming and requires technical expertise.&lt;/p&gt;

&lt;p&gt;On the other hand, SaaS solutions provide a more user-friendly configuration. You can launch your headless CMS with minimal effort. SaaS options also alleviate infrastructure management requirements, allowing developers to focus more on CMS customization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform Maintenance
&lt;/h3&gt;

&lt;p&gt;SaaS platforms do not require much maintenance. The only requirement is to maintain the content within the headless CMS. The platform provider is responsible for the underlying infrastructure and performance. Additionally, you will have a dedicated support option to contact for mitigating any issues within the platform.&lt;/p&gt;

&lt;p&gt;In an open source platform, you are responsible for infrastructure maintenance, and the only support option is asking the open source community that contributes to the project. This approach is more risky, but provides greater control over platform performance and allows you to fine tune the platform based on your unique needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;A SaaS provider manages the &lt;a href="https://resources.fabric.inc/blog/ecommerce-security" rel="noopener noreferrer"&gt;security&lt;/a&gt; and &lt;a href="https://resources.fabric.inc/blog/ecommerce-pci-compliance" rel="noopener noreferrer"&gt;compliance&lt;/a&gt; of the headless CMS. In an open source implementation, most projects are dependent on the contributors to adhere to compliance and security standards. Therefore, the security implications are solely on the shoulders of developers. Like platform maintenance, this approach is riskier and more time consuming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customization
&lt;/h3&gt;

&lt;p&gt;An open source platform is only limited by the developer’s imagination and skillset to customize the application to suit any requirement. You have complete access to the source code, and you can even add features or extend existing features. In contrast, a SaaS platform is limited to the feature set and customization options offered by the provider. However, some Saas platforms &lt;a href="https://fabric.inc/xm" rel="noopener noreferrer"&gt;like Fabric&lt;/a&gt; offer unique features like “experience management” from the get-go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;This is the point where both open source and SaaS platforms offer an equal amount of flexibility. Both options provide the ability to integrate with third-party platforms like payment gateways, ERP platforms, message brokers, social media, and more. The only difference is that, in an open source platform, you have the option to create a new connector to facilitate a new integration with the help of the community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The summary of all the points above is illustrated in the table below.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SaaS&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup Difficulty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium/High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technical Expertise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low/Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security and Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unmanaged (User Responsibility)&lt;/td&gt;
&lt;td&gt;Managed (Provider Responsibility)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community Dependent&lt;/td&gt;
&lt;td&gt;Platform Dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (High)&lt;/td&gt;
&lt;td&gt;Yes (Granularity Dependent on Provider)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integrations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Open Source Headless CMS Options
&lt;/h2&gt;

&lt;p&gt;Here we will explore some of the best available open source headless CMS options. We will mainly focus on the features offered by each option and the differences between them. The following options will be used for this comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; GraphCMS is not open source but we have included it because it’s a popular tool and there is a free community version.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/TryGhost/Ghost" rel="noopener noreferrer"&gt;Ghost&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/strapi/strapi" rel="noopener noreferrer"&gt;strapi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://graphcms.com/headless-cms-comparison" rel="noopener noreferrer"&gt;GraphCMS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/agentejo/cockpit" rel="noopener noreferrer"&gt;cockpit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/apostrophecms/apostrophe" rel="noopener noreferrer"&gt;Apostrophe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/directus/directus" rel="noopener noreferrer"&gt;Directus&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following table illustrates a comparison of the main features of some of the best open source headless CMS options.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ghost&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;strapi&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;cockpit&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Apostrop&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Directus&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;GraphCMS&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rich Content Editing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secure Authentication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Email &amp;amp; Messaging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 3&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅4&lt;/td&gt;
&lt;td&gt;✅ 3&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multilingual Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESTful API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GraphQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQL Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 2&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NoSQL Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 2&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Webhooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 4&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker/K8 Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 4&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Premium Offering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; Offers their own database solutions&lt;/li&gt;
&lt;li&gt; Limited to SQLite and MongoDB&lt;/li&gt;
&lt;li&gt; Limited Support&lt;/li&gt;
&lt;li&gt; Through Plugins or Extensions&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ghost&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Ghost platform (&lt;a href="https://github.com/TryGhost/Ghost" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) under the Ghost Foundation is a headless CMS focused on providing a publishing platform from individuals to businesses. The platform is developed using Javascript (Node.js) and is distributed under the MIT license. Ghost offers a suite of modern publishing tools, a fully-featured content editor, multi-author, multi-language content creation, and chronological content.&lt;/p&gt;

&lt;p&gt;Having its primary focus on publishing, Ghost provides inbuilt support for subscription and membership management. Additionally, Ghost provides support for global payments through Stripe and provides a user analytics function.&lt;/p&gt;

&lt;p&gt;Ghost can also be integrated with existing tools like Zapier, Slack, and Mailchimp to extend the workflows and provide a unified experience. It is used by prominent services like Mozilla, DigitalOcean, Airtable, and Tinder to power their publishing platforms.&lt;/p&gt;

&lt;p&gt;Moreover, Ghost provides a JavaScript library to interact with the Content API, making it easier to interact with the content without creating manual API calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GhostContentAPI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="c1"&gt;// Ghost DEMO site&lt;/span&gt;
        &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://demo.ghost.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// Authentication via API Keys&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;22444f78447824223cefc48062&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// fetch 5 posts, including related tags and authors&lt;/span&gt;
      &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tag:fiction+tag:fiction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Strapi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Strapi (&lt;a href="https://github.com/strapi/strapi" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is an open source headless CMS designed to work with all &lt;a href="https://dev.to/fabric_commerce/how-butcherbox-made-e-commerce-600-faster-with-jamstack-5kf"&gt;Jamstack sites&lt;/a&gt;. This developer-focused platform gives developers a flexible and extensible platform to manage and distribute content using their favorite tools and platforms. Strapi supports both relational and non-relational databases and is frontend agnostic, allowing developers to use it with any frontend framework (React, Angular, Vue).&lt;/p&gt;

&lt;p&gt;Strapi can be used to build simple websites, mobile applications, to fully-featured e-commerce platforms. It also provides support for both RESTful and GraphQL to interact with the API. Its powerful CLI module lets you create and manage projects easily within seconds.&lt;/p&gt;

&lt;p&gt;This platform can be further extended using third-party integrations like Redism, Sentrym, and Mailgun. Another major feature of Strapi is that it’s secure by default, providing various configuration options like CROS, CSP, and XSS out of the box. The following code samples show you how to query the Strapi API using the Axios library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;     &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Request API.&lt;/span&gt;
      &lt;span class="nx"&gt;axios&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:1337/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Handle success.&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Data: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Handle error.&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;An error occurred:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Cockpit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cockpit (&lt;a href="https://github.com/agentejo/cockpit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is one of the simplest headless CMS platforms. With its API-first approach, Cockpit aims to provide a simple yet powerful backend to manage content that can be delivered through multiple channels.&lt;/p&gt;

&lt;p&gt;Developed in 2013, the goal of the Cockpit project was to provide a comprehensive platform for managing structured and reusable content while maintaining the simplicity of functionality needed to provide data through the API in JSON format. The main features of the Cockpit CMS are the ability to manage flexible content modes, a simple uncluttered backend user interface, and high scalability.&lt;/p&gt;

&lt;p&gt;The Cockpit CMS can be easily integrated into any project without having to build scripts or include any advanced PHP libraries. It is also tested on both Apache and Nginx servers for smooth operation.&lt;/p&gt;

&lt;p&gt;The interactions with the API are authenticated using an API token. The following example demonstrates a simple GET request to retrieve posts from the Cockpit CMS using the fetch method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/collections/get/posts?token=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;fieldA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fieldB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;_created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;ApostropheCMS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unlike all other open source CMS software, Apostrophe (&lt;a href="https://github.com/apostrophecms/apostrophe" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is a fully-featured open source CMS built with Node.js and &lt;a href="https://dev.to/blog/nosql-ecommerce-data-model"&gt;MongoDB&lt;/a&gt;. Apostrophe offers a headless option through apostrophe-headless, enabling developers to integrate it with any jamstack and provide content through a RESTful API. This combined approach allows developers to mix and match the functionality of a traditional CMS and a headless CMS to meet their exact requirement.&lt;/p&gt;

&lt;p&gt;Apostrophe is geared towards a rapid, agile development cycle reducing the “software time to market.” Furthermore, Apostrophe breaks its functionality into different components, enabling developers to customize the CMS platform and build a solution that suits their needs.&lt;/p&gt;

&lt;p&gt;You can extend Apostrophe using extensions and Integrations such as Salesforce Personas, Redis Caching, Stagecoach, Webhook notifications, and more.&lt;/p&gt;

&lt;p&gt;As apostrophe-headless is an extension to the Apostrophe, you need to activate the package by installing the npm package and activating and exposing the required content using the REST API. The authentication can be done via API Keys or Bearer Tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Configuration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="nx"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apostrophe-headless&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nl"&gt;apiKeys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;//Other configurations&lt;/span&gt;
                &lt;span class="c1"&gt;// Expose via API&lt;/span&gt;
                &lt;span class="nl"&gt;restApi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code below enables you to query for data in Apostrophe using the REST API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Get all products&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Directus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Being the most data-driven headless CMS platform, Directus (&lt;a href="https://github.com/directus/directus" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is all about data. This open source headless CMS platform is built using Node.js and utilizes Vue.js to provide the administration interface. It’s distributed under the GPLv3 license.&lt;/p&gt;

&lt;p&gt;Directus can connect to a preexisting database or create a new database to complement your project and provide the necessary content using the RESTful or GraphQL API. This CMS platform has the widest support for relational database software with free solutions like MariaDB and SQLite as well as commercial solutions like MS-SQL and Oracle DB. This enables developers to select the ideal database to match their requirements.&lt;/p&gt;

&lt;p&gt;Directus provides a fully-featured administrative interface to manage the above-mentioned databases. Another major factor of this headless CMS is its sheer customizability from full-text search, translations, workflows, and event hooks.&lt;/p&gt;

&lt;p&gt;Furthermore, Directus supports creating custom API endpoints and offers a command-line interface to create and manage projects. It also provides a JavaScript SDK which acts as a wrapper around the Axios library tailored to interact with the API. &lt;/p&gt;

&lt;p&gt;You can see how to utilize the Directus SDK to authenticate a user and return required items in the following code block. With the help of SDK, Directus simplifies the development lifecycle by offering prebuilt functionality for API interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DirectusSDK&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@directus/sdk-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;directus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DirectusSDK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Authentication using email and password.&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;directus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

            &lt;span class="c1"&gt;// Obtain all the articles.&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;directus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;GraphCMS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://graphcms.com/" rel="noopener noreferrer"&gt;GraphCMS&lt;/a&gt; is a native GraphQL headless content management system. The objective of this headless cms platform is to provide users with an exceptional digital experience while simplifying content management. GraphCMS is frontend agnostic and is developed by GraphCMS GmbH.&lt;/p&gt;

&lt;p&gt;One of the best features of GraphCMS is its Digital Asset Handling which allows developers to transform their digital assets into different formats and structures. For instance, GraphCMS natively supports resizing image assets and converting files into different types.&lt;/p&gt;

&lt;p&gt;Another powerful feature of GraphCMS is its approach to content personalization and flexible content modeling. It enables developers to create dynamic content for target audiences and tailor the content to match the user requirements by modeling the content.&lt;/p&gt;

&lt;p&gt;On top of that, GraphCMS uses Authentication Tokens to authorize the API requests. The following code block illustrates a simple query to obtain published posts about dogs, ordered by their created timestamp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nx"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;title_contains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="nl"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;createdAt_DESC&lt;/span&gt;
              &lt;span class="nx"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PUBLISHED&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="nx"&gt;id&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&lt;/p&gt;

&lt;h2&gt;
  
  
  Headless CMS: Best SaaS Option
&lt;/h2&gt;

&lt;p&gt;Going open source is an option only if you have enough time to invest in configuring and setting up the headless CMS solution to meet your exact needs. If that is not the case, the best option is to choose a SaaS platform. It provides you with an out-of-the-box solution that can be adapted to fit your requirements with just a few modifications or configuration changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fabric XM
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Fxm-editor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ff.hubspotusercontent00.net%2Fhubfs%2F6994951%2Fxm-editor.png" alt="xm-editor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Among numerous available SaaS solutions, &lt;a href="https://fabric.inc/" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt; is one of the best SaaS headless CMS options. It offers tailored features like &lt;a href="https://fabric.inc/storefront" rel="noopener noreferrer"&gt;Storefront&lt;/a&gt; to fast track development of an interface and &lt;a href="https://fabric.inc/xm" rel="noopener noreferrer"&gt;Experience Manager&lt;/a&gt; to create user- and channel-specific experiences. Additionally, a fully customizable API enables developers to extend the functionality to match their requirements. &lt;/p&gt;

&lt;p&gt;In addition to offering support, Fabric also offers &lt;a href="https://fabric.inc/services" rel="noopener noreferrer"&gt;a service&lt;/a&gt; to get your application up and running at every stage of the development process and keep your application in optimal condition to provide a unified experience to any user across the globe. By choosing a SaaS platform like Fabric, you can enjoy all these benefits without having to worry about infrastructure or complex technical considerations.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Best SSL certificate providers</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Thu, 24 Oct 2019 08:44:51 +0000</pubDate>
      <link>https://forem.com/shanikanishadhi/best-ssl-certificate-providers-3j64</link>
      <guid>https://forem.com/shanikanishadhi/best-ssl-certificate-providers-3j64</guid>
      <description>&lt;p&gt;In the digital era nowadays, SSL certificates are needed to provide for security when transacting online. It is the method to verify webpages and domains to ensure that all the information and transactions are secure. However, you must pick a good SSL provider and make it easier for you, we have bought 10 providers that we think is worth considering.&lt;/p&gt;

&lt;h1&gt;
  
  
  1- Comodo SSL
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7LBEovq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/0%2Ai9iCPGN4YJubFGiQ%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7LBEovq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/0%2Ai9iCPGN4YJubFGiQ%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tvBgjthR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/391/0%2Ai9iCPGN4YJubFGiQ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tvBgjthR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/391/0%2Ai9iCPGN4YJubFGiQ" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ssl.comodo.com/"&gt;Comodo SSL&lt;/a&gt;  provides the highest level of encryption compared to other providers. Since it is automated online, there is no need for any paperwork and causes no delays as well. It costs around US$7.27 a year making it quite affordable too. It also has a 99.9% browser recognition and also provides an SSL certificate management tool. There are a PCI scanning and a trusted logo that helps for customer conversion too. Comodo also provides a ‘premium SSL’ solution that costs around US$56 for 4 years which also includes a 256 — bit encryption. ComodoSSL also provides a free site seal.&lt;/p&gt;

&lt;h1&gt;
  
  
  2 — DigiCert
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zl7lZgqs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AkqaxZh-3tzh5iOkZffgQEQ.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zl7lZgqs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AkqaxZh-3tzh5iOkZffgQEQ.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jssl1HwY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/272/1%2AkqaxZh-3tzh5iOkZffgQEQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jssl1HwY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/272/1%2AkqaxZh-3tzh5iOkZffgQEQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digicert.com/"&gt;DigiCert&lt;/a&gt;  is not very affordable and costs around US $188 a year. It provides free SSL tools and unlimited reissues as well. You can also expect world-class customer service when dealing with DigiCert as they are very patient and can guide you through a step by step process. It has both strong encryption and high authentication along with other options like Wildcard SSL and multi-domain SSL. the user interface is very easy and its’ speed is one of the key highlights.&lt;/p&gt;

&lt;h1&gt;
  
  
  3- Entrust Datacard
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pxAoiBas--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2A8uF8pe3hPS_BXNWrD7Om-A.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pxAoiBas--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2A8uF8pe3hPS_BXNWrD7Om-A.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f8PXwojK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/273/1%2A8uF8pe3hPS_BXNWrD7Om-A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f8PXwojK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/273/1%2A8uF8pe3hPS_BXNWrD7Om-A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.entrustdatacard.com/"&gt;Entrust Datacard&lt;/a&gt;  has been around since 1994 and is one of the most trusted providers. It provides tools and resources to install SSL properly and can manage many certificates as well. Entrust Datacard also has a wide selection such as ID card printers, credit card printers and PKI as well. However, the SSL certificate is their best product. The standard SSL for one site costs around $174 whereas the wildcard SSL is $609 a year. It can cover an unlimited amount of servers and sub-domains.&lt;/p&gt;

&lt;h1&gt;
  
  
  4 — GeoTrust
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--seGsg3dd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AtFcxNpRJzI90Di9pD3fYpQ.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--seGsg3dd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AtFcxNpRJzI90Di9pD3fYpQ.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rcib4Ru3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/271/1%2AtFcxNpRJzI90Di9pD3fYpQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rcib4Ru3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/271/1%2AtFcxNpRJzI90Di9pD3fYpQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.geotrust.com/"&gt;GeoTrust&lt;/a&gt;  provides services in three areas which are signing services, SSL certificates and enterprise services. Owned by Symantec, it price costs around US $87 a year and is the best place to secure your website as they have discount rates and a 30- day money-back guarantee as well. They also provide 256-bit encryption and a free site seal. The issuance speed is usually less than an hour which is acceptable.&lt;/p&gt;

&lt;h1&gt;
  
  
  5- GlobalSign
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QI2MakG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2A50tQneE57Ea-nI_uXpaaww.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QI2MakG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2A50tQneE57Ea-nI_uXpaaww.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XmJ6-QN---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/266/1%2A50tQneE57Ea-nI_uXpaaww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XmJ6-QN---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/266/1%2A50tQneE57Ea-nI_uXpaaww.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.globalsign.com/en/"&gt;GlobalSign&lt;/a&gt;  is another trusted provider found back in 1996. You can secure from a single website to multiple domains with this provider. Thus, it is very flexible and scalable. Apart from strong encryption, it also has added value features such as free SSL tools and PKI solutions as well. It also provides phishing detection, malware scans and comes with a 2048 bit SSL. however, unlike others, GlobalSign is not cheap and costs around $250 for a single site. GlobalSign also has a secure site seal so that clients or visitors have more confidence.&lt;/p&gt;

&lt;h1&gt;
  
  
  6 — GoDaddy
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H6G5wtmO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AaAjtmUHFYhpmtBiNt9wHpQ.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H6G5wtmO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AaAjtmUHFYhpmtBiNt9wHpQ.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MdZ6_oQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/272/1%2AaAjtmUHFYhpmtBiNt9wHpQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MdZ6_oQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/272/1%2AaAjtmUHFYhpmtBiNt9wHpQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using an SSL certificate from  &lt;a href="https://www.godaddy.com/"&gt;GoDaddy&lt;/a&gt;  will show that your site is authentic and trustworthy. SSL certificates from GoDaddy provides a 128- bit encryption for standard and 256- bit encryption for a higher grade. The cost for a single site is usually $79 a year and a domain costs $370 a year. Using this domain, you get a McAfee secure seal and a 2048 encryption. Like others, GoDaddy also provides a 30- day money-back guarantee and unlimited free reissues. There is also 24/7 unlimited security support.&lt;/p&gt;

&lt;h1&gt;
  
  
  7 — Network Solutions
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OdP2oBF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AVgh0bxquF_-1XajnFxnvsQ.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OdP2oBF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AVgh0bxquF_-1XajnFxnvsQ.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dZAjehLr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/272/1%2AVgh0bxquF_-1XajnFxnvsQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dZAjehLr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/272/1%2AVgh0bxquF_-1XajnFxnvsQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like GoDaddy,  &lt;a href="https://www.networksolutions.com/"&gt;Network Solutions&lt;/a&gt;  also provides other services apart from SSL certificates like e-commerce solutions. It gives a 256- bit encryption and ensures data is safe from the hands of hackers. It costs around $59.9 for a single site which is for two years. However, it doesn’t provide a lot of technical support if you are looking for such. All the SSL certificates with an ‘https’ and the closed padlock so that your site is seemingly secure and places confidence in users, particularly when transacting. The green address bar is only there in the extended version but the site seal is there in every version except the Xpress. They also provide 24/7 live support as well.&lt;/p&gt;

&lt;h1&gt;
  
  
  8 — RapidSSL
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7nMCJe_s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AKo3WLMCU_er-dzsC7ogDKQ.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7nMCJe_s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AKo3WLMCU_er-dzsC7ogDKQ.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HsTuhWRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/265/1%2AKo3WLMCU_er-dzsC7ogDKQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HsTuhWRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/265/1%2AKo3WLMCU_er-dzsC7ogDKQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rapidssl.com/"&gt;RapidSSL&lt;/a&gt;  is a cheaper solution which costs around $17 a year for a single site. Although its cost is low, its provided by a leading certificate authority since it is a subsidiary of GeoTrust. It is also very fast, easy to install with a step by step guide and also provides 256-bit encryption. RapidSSL also provides its users with 24/7 web and mail support and also has a 30-day money-back guarantee like many other providers. Just like other providers, issuance speed is quite rapid and it also has a 99% browser support.&lt;/p&gt;

&lt;h1&gt;
  
  
  9 — SSL.com
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eT6ep_SU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AvfE0Y7KN3rVzzHYrhosPTg.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eT6ep_SU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AvfE0Y7KN3rVzzHYrhosPTg.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w3YV0HGS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/292/1%2AvfE0Y7KN3rVzzHYrhosPTg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w3YV0HGS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/292/1%2AvfE0Y7KN3rVzzHYrhosPTg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;provides everything from SSL, wildcard, UCC, SAN, and EV certificates as well. The basic SSL costs around $36 a year for one domain. The Enterprise EV UCC/SAN SSL is the highest that costs $320 a year which allows multiple domains, subdomains and a green bar which ensures confidence.&lt;/p&gt;

&lt;p&gt;However, the basic is also worth as it trusted with almost 99% of the browsers and has a 2048 bit SHAA 2 encryption. They have a strong customer service with a 24/7 chat, email, and phone support. The prices are affordable as well and also gives free lifetime certificate reissues.&lt;/p&gt;

&lt;h1&gt;
  
  
  10 — Thawte
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TON-7Voc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AOyioE0JX_V16TKCPt81g5A.png%3Fq%3D20" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TON-7Voc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/30/1%2AOyioE0JX_V16TKCPt81g5A.png%3Fq%3D20" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OLPnvCPi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/112/1%2AOyioE0JX_V16TKCPt81g5A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OLPnvCPi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/112/1%2AOyioE0JX_V16TKCPt81g5A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;is another solid option if you are thinking of getting an SSL certificate. It is a global SSL provider with a history of 17 years. Thus, it is surely a reliable platform. The cheapest certificate costs around $47. It comes with a 21-day free trial and also has a Thawte site seal logo. It has 99% browser compatibility and has a 256- bit encryption. They also have a support team via chat, phone or email which is very reliable. There is also a NetSure warranty for all the SSL plans and are also compatible with Internationalized domain names.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final thoughts
&lt;/h1&gt;

&lt;p&gt;In conclusion, SSL certificates are essential to ensure encryption and authentication. Most providers have similar features but it varies a little. Having a certificate will ensure that your site is reliable, safe and secure. However, choosing the right provider depends on your requirements and needs. Thus, go through this article and choose the provider that you think is the perfect choice for you!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>jQwidgets Grid with React Features</title>
      <dc:creator>Shanika Wickramasinghe</dc:creator>
      <pubDate>Fri, 09 Aug 2019 10:14:33 +0000</pubDate>
      <link>https://forem.com/shanikanishadhi/jqwidgets-grid-with-react-features-35k0</link>
      <guid>https://forem.com/shanikanishadhi/jqwidgets-grid-with-react-features-35k0</guid>
      <description>&lt;p&gt;React is a light-weighted library, which is widely used for UI/UX designs of web pages. It provides one of the responsive and flexible grids which display the data in tabular form using jQWidgets. &lt;/p&gt;

&lt;p&gt;This article covers the basic steps to create a jQWidgets grid for React using typescript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation of React:
&lt;/h2&gt;

&lt;p&gt;React is an interactive library which renders the right components while the data changes. To install React we will first need to install node.js 8.10 or later versions. Check for node.js and npm versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create React App:
&lt;/h2&gt;

&lt;p&gt;Using npm we will create an application for React as given below. This creates the folder structure and the directory called my-app. Once my-app is created, cd to my-app and type npm start. The project opens in &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -g create-jqwidgets-react-app
npx create-jqwidgets-react-app my-app --typescript
cd my-app
npm install jqwidgets-script –save--dev
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The folder structure is as below:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkpzs1ekkrwiqce1k9deo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkpzs1ekkrwiqce1k9deo.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Simple jQWidgets Grid Component for React:
&lt;/h2&gt;

&lt;p&gt;Once the required folders and files are created we will work on the settings and imports needed for jQWidgets grid component of React.&lt;/p&gt;

&lt;h2&gt;
  
  
  App.htm file:
&lt;/h2&gt;

&lt;p&gt;We will add the below links to the  section of App.html page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="canonical" href="https://www.jqwidgets.com/react/react-grid/" /&amp;gt;
&amp;lt;link rel="stylesheet" href="../jqwidgets/styles/jqx.base.css" type="text/css" /&amp;gt;
&amp;lt;script type="text/javascript" src="../scripts/demos.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="./../node_modules/react/umd/react.production.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="./../node_modules/react-dom/umd/react-dom.production.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  App.tsx file:
&lt;/h2&gt;

&lt;p&gt;In App.tsx file we will first import jqxGrid from jqwidgets-react. This will provide the jqxGrid component created for React library. We will use a few CSS files for styling the grid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'jqwidgets-scripts/jqwidgets/styles/jqx.base.css';
import 'jqwidgets-scripts/jqwidgets/styles/jqx.material-purple.css';
import JqxGrid, { IGridProps, jqx } from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxgrid';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we will create the App class using jqxGrid, we will first construct the properties by setting the grid with source properties like data field, datatype, id, record, etc.  Later we will set the state for this grid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export class App extends React.PureComponent&amp;lt;{}, IGridProps&amp;gt; {
    constructor(props: {}) {
        super(props);
        const source: any = {
            datafields: [
                { name: 'Name', type: 'string' },
                { name: 'Sex'  , type: 'string' },
                { name: 'City', type: 'string' },
                { name: 'Address', type: 'string },
            ],
            datatype: 'xml',    
            id: 'NameID',
            record: 'Name',
            root: 'Name',
            url: './../sampledata/Details.xml'
        };  
//set the state for widget.
    this.state = {
        columns: [
            { text: 'Name', datafield: 'Name', width: 250 },
            { text: 'Sex', datafield: 'Sex', width: 100 },
            { text: 'City', datafield: 'City', width: 80 },                                                      { text: 'Address', datafield: 'Address', width: 350 },
        ],
        source: new jqx.dataAdapter(source)
    }
}
public render() {
    return (
        &amp;lt;JqxGrid
        // @ts-ignore
            width={this.state.width} source={this.state.source} columns={this.state.columns} autoheight={true} altrows={true}
        } /&amp;gt;
      )
    }  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you define all your properties and state to the grid we will render this component using the &lt;code&gt;render()&lt;/code&gt;. Once you run this sample example your grid would look like below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Feeb4ctutg26qfyxfurw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Feeb4ctutg26qfyxfurw4.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Grid Features for React:
&lt;/h2&gt;

&lt;p&gt;jQWidgets Data Grid for React is built for professional use with features like sorting, filtering, grouping, paging, editing, drag-drop, nested grids, etc. Before we will look into how to enable these features for better user experience, we need to add bundle.js files for respective features in App.html eg: adding bundle files for sorting in App.htm file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="app"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script src="../dist/grid_sorting.bundle.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sorting:
&lt;/h3&gt;

&lt;p&gt;The sortable property enables or disables the data sorting. In the code example below, the Grid data sorting is enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;JqxGrid ref={this.myGrid} onSort={this.myGridOnSort}
    width={getWidth('grid')} height={450} source={this.state.source} columns={this.state.columns} sortable={true} altrows={true} filterable={true} selectionmode={'multiplecellsadvanced'} /&amp;gt;
&amp;lt;/JqxGrid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To enable or disable the sorting of a Grid column, you can set its sortable property to false. Also when the sorting data type is Date, Number or Boolean, the 'type' property in the 'datafield' array should be set.&lt;br&gt;
The 'sortcolumn' property specifies the default Grid sort column, i.e. when the grid is displayed, the data will be sorted. The 'sortdirection' property specifies the sort order of the sort column.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sortcolumn: 'ColumnName',
sortdirection: 'asc'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The “sortby” function can be used to sort the Grid through the API. This function should be called when the grid data is fully loaded. The first parameter is the Column's DataField. The second parameter is the sort order - 'asc' or 'desc'. &lt;/p&gt;

&lt;h3&gt;
  
  
  Filtering:
&lt;/h3&gt;

&lt;p&gt;To enable the filtering feature, you need to set the 'filterable' property to true. When the value of the filterable property is true, the grid displays a filtering panel in the columns popup menus. Filtering can be done in background or can be customized.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;JqxGrid ref={this.myGrid} onFilter={this.onFilter}
     width={getWidth('grid')} source={this.state.source} columns={this.state.columns}
    filterable={true} sortable={true} ready={this.state.ready} autoshowfiltericon={true} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjvptfv94iwqanrft33oa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjvptfv94iwqanrft33oa.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Grid Grouping:
&lt;/h3&gt;

&lt;p&gt;The jqxGrid component supports data grouping against one or more columns. Grouping is allowed if the 'groupable' property is set to true. End-users can group data by dragging the column headers to the Group Panel. &lt;br&gt;
The code example below shows a Grid template with one grouping column:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;JqxGrid ref={this.myGrid}
    onGroupexpand={this.onGroupExpand} onGroupcollapse={this.onGroupCollapse}
                    // @ts-ignore
    width={getWidth('grid')} groupable={true} columns={this.state.columns}
    source={this.state.source} groups={['Country']} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpmy96raofowubx57yt7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpmy96raofowubx57yt7l.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Grid Paging:
&lt;/h4&gt;

&lt;p&gt;The built-in paging capability gives an additional edge to display a large amount of data in tabular format. The &lt;code&gt;pageable&lt;/code&gt; property is set to true, to make the paging available.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;JqxGrid ref={this.myGrid}
    onPagechanged={this.onPageChanged}  onPagesizechanged={this.onPageSizeChanged}
          // @ts-ignore
          width={getWidth('grid')} source={this.state.source}   columns={this.state.columns}
          pageable={true} sortable={true} columnsresize={true}
          autoheight={true} selectionmode={'multiplerowsextended'} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pagechanged or pagesizechanged events are raised when the page is changed or page size is changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private onPageChanged(event: any): void {
        this.eventsLog.current!.style.display = 'block';
        const loggedElements = document.getElementsByClassName('logged');
        if (loggedElements.length &amp;gt;= 5) {
            this.myPanel.current!.clearcontent();
        }
        const args = event.args;
        const eventData = 'pagechanged &amp;lt;div&amp;gt;Page:' + args.pagenum + ', Page Size: ' + args.pagesize + '&amp;lt;/div&amp;gt;';
        this.myPanel.current!.prepend('&amp;lt;div class="logged" style="margin-top: 5px;"&amp;gt;' + eventData + '&amp;lt;/div&amp;gt;');
        // get page information.
        const paginginformation = this.myGrid.current!.getpaginginformation();
        this.pagingInfo.current!.innerHTML = '&amp;lt;div style="margin-top: 5px;"&amp;gt;Page:' + paginginformation.pagenum + ', Page Size: ' + paginginformation.pagesize + ', Pages Count: ' + paginginformation.pagescount + '&amp;lt;/div&amp;gt;';
    }
    private onPageSizeChanged(event: any): void {
        this.eventsLog.current!.style.display = 'block';
        this.myPanel.current!.clearcontent();
        const args = event.args;
        const eventData = 'pagesizechanged &amp;lt;div&amp;gt;Page:' + args.pagenum + ', Page Size: ' + args.pagesize + ', Old Page Size: ' + args.oldpagesize + '&amp;lt;/div&amp;gt;';
        this.myPanel.current!.prepend('&amp;lt;div style="margin-top: 5px"&amp;gt;' + eventData + '&amp;lt;/div&amp;gt;');
        // get page information.
        const paginginformation = this.myGrid.current!.getpaginginformation();
        this.pagingInfo.current!.innerHTML = '&amp;lt;div style="margin-top: 5px;"&amp;gt;Page:' + paginginformation.pagenum + ', Page Size: ' + paginginformation.pagesize + ', Pages Count: ' + paginginformation.pagescount + '&amp;lt;/div&amp;gt;';
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The grid paging also displays the drop-down list component in the pager area. By default, the size options are 5, 10 and 20. The "pager" property enables you to set different modes to display the pagination for a grid. You have two modes for “pager” settings, default and simple. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftqzvg4q2ss7wi7rf9r4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftqzvg4q2ss7wi7rf9r4m.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Grid Cell Editing:
&lt;/h3&gt;

&lt;p&gt;Grid cell editing is one of the important features for interactiveness of the grid. This feature resembles the data entering experience in an Excel Spreadsheet – once you select a grid cell, you can enter data when you start typing text. The Grid's 'editable' property specifies whether the editing is enabled or not. &lt;br&gt;
The Grid has APIs for showing and hiding the cell editors. The ‘cellBeginEditEvent’ method allows you to put a specific cell into edit mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;this.cellBeginEditEvent = this.cellBeginEditEvent.bind(this);
this.cellEndEditEvent = this.cellEndEditEvent.bind(this);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ‘cellEndEditEvent’ method ends the edit operation and confirms or cancels the changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public render() {
        return (
            &amp;lt;div&amp;gt;
                &amp;lt;JqxGrid onCellbeginedit={this.cellBeginEditEvent} onCellendedit={this.cellEndEditEvent}
                    // @ts-ignore
                    width={getWidth('grid')} source={this.state.source} columns={this.state.columns}
                    editable={true} enabletooltips={true} selectionmode={'multiplecellsadvanced'} /&amp;gt;
                &amp;lt;div style={{ fontSize: '12px', fontFamily: 'Verdana', marginTop: '30px' }}&amp;gt;
                    &amp;lt;div ref={this.beginEdit} /&amp;gt;
                    &amp;lt;div ref={this.endEdit} style={{ marginTop: '10px' }} /&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
    private cellBeginEditEvent(event: any): void {
        const args = event.args;
        this.beginEdit.current!.innerHTML = 'Event Type: cellbeginedit, Column: ' + args.datafield + ', Row: ' + (1 + args.rowindex) + ', Value: ' + args.value;
    }
    private cellEndEditEvent(event: any): void {
        const args = event.args;
        this.endEdit.current!.innerHTML = 'Event Type: cellendedit, Column: ' + args.datafield + ', Row: ' + (1 + args.rowindex) + ', Value: ' + args.value;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To confirm the edit mode, we will have to press the &lt;code&gt;Esc&lt;/code&gt; key. The grid can be customized to display the validation popup message when the new cell's value is not valid for any column or grid.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhvk1br01874fql85un35.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhvk1br01874fql85un35.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary:
&lt;/h2&gt;

&lt;p&gt;jQWidgets grid for React is a very flexible and powerful tool to allow you to add lots of data with multiple pages. This article demonstrates the basic steps to create the jQWidgets grid for React using typescript. We have also discussed a few interactive features which are basic and are needed for UI of any website. There are a lot more features of the grid, you will have to explore a bit of these features and use the best needed for the UI/ UX design of your page.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
