Software Development Practices
A Modern General Purpose Database is designed to meet the needs of as many applications as possible while providing features such as scalability, flexibility, and robust performance metrics to handle diverse workloads effectively. It is not designed to manage any specific type of data or workload. It influenced the design of many rational databases such as Oracle, MySQL, and Postgres.
General Purpose Databases were designed to run on a single server and host the associated data on that server. The introduction of the internet and smart devices then caused an exponential growth in data(personal user data, social graphs, user generated content etc).
Scaling thus became a genuine problem for databases as data volumes increased.
That is when Vertical and Horizontal scaling was introduced.
Vertical Scaling → happens when the resources on a single machine are increased. Said resources refer to machine hardware, such as the cpu, the disk capacity or the memory.
Horizontal Scaling → is where the resources are increased by providing more machines
Non-Relational Databases
These use polymorphic data structures with flexible schemas. They are also easy to scale large workloads.
With non-relational databases, data is modelled in a different way to tabular models. But there was the implicit recognition of horizontal scaling as an issue.
“Eventual consitstency“ was intrroduced as a means of addressing consistency in Consistency Availability Partiontioning (CAP thrm).
CAP Theorem
This is the foundational principle in distributed systems. It states that in a distributed data store, we can only achieve two out of three guarantees, namely, consistency, availability and partition tolerance.
Consistency → Every user sees the same data at the same time
Availability → Every request gets a response, even if some parts of the system are down.
Partition Tolerance → The system continues to operate even if there are communication issues between nodes.
We use non-
relational database when:
Working with polymorphic data that changes frequently,
Promoting developer productivity
Cloud Computing
Software Development
Tooling in Software Development refers to a set of utility programs and systems used to automate, standardise, and streamline the development cycle.
Developers rely on tooling for 2 primary reasons:
Standardisation → Ensuring that all files and components that are situated within a project are known, by convention.
Productivity → Common and repetitive tasks are taken care of by the tools, thus allowing more focus on writing the actual software logic.
Common Software Dev tooling categories are
Package managers
Virtual Environments
Version Control Systems
Task Runners
Formatters
Test Frameworks