PostgreSQL is a freely-distributed object-relational database management system, developed by an international community of developers and not controlled by any company or individual. PostgreSQL is distributed under a free license which allows it to be included in commercial software products.
Strengths of PostgreSQL are considered to be:
- high performance and robust transaction and replication mechanisms;
- extensible embedded programming languages: PL/pgSQL, PL/Perl, PL/Python and PL/Tcl are supported as standard; PL/Java, PL/PHP, PL/Py, PL/R, PL/Ruby, PL/Scheme, PL/sh and PL/V8 can be used in addition, and C-compatible module loading is available;
- easy extensibility
- Functions are blocks of code executed on the server, not the database client. Although they can be written in pure SQL, implementing additional logic, such as conditional jumps and loops, goes beyond SQL and requires some language extensions
- Triggers are defined as functions initiated by DML operations. For example, an INSERT operation may trigger a trigger that checks the added record against certain conditions. When writing functions for triggers, various programming languages may be used.
- Rules and views - the mechanism of rules is a mechanism for creating custom handlers not only for DML-operations, but also for the selection operation. The main difference from the trigger mechanism is that the rules are triggered at the stage of parsing the request, before choosing the optimal execution plan and the execution process itself. Rules allow you to override system behavior when executing SQL operations on a table.
- PostgreSQL has support for indexes of the following types: B-tree, hash, GiST, GIN, BRIN, Bloom. If necessary, you can create new types of indexes.
- PostgreSQL supports simultaneous modification of the database by multiple users through Multiversion Concurrency Control (MVCC). This ensures that ACID requirements are met and there is almost no need for read locks.
- PostgreSQL supports a large set of built-in data types.
Tables can inherit characteristics and field sets from other (parent) tables. The data added to the spawned table will automatically participate (if not specified separately) in queries to the parent table.
In PostgreSQL 10 the table partitioning mechanism was added. Partitioning is designed to divide one table into several tables, called partitions. Partitioning is similar to inheritance, but has a more user-friendly syntax and stricter constraints, which allows for additional optimization when planning queries.
More information can be found at Wiki.