---
# System prepended metadata

title: Database principles
tags: [essay, priciples]

---

{%hackmd SybccZ6XD %}
<style>
.toc > ul > li:first-child {
  list-style: none;
}
.toc > ul > li:first-child > a {
  display: none;
}
</style>

Database principles
===

###### tags: `essay` `priciples`

> [name=Shueh Chou Lu][time=Dec 25, 2020]

[TOC]

---

一個應用程式需要滿足許多需求才能提供特定服務。

- 功能性需求，例如：允許存取資料、搜尋等等。
- 非功能性需求，例如：
  - 安全性（security）
  - 可靠性（reliability）
  - 順從性（compliance）
  - 可延展性（compatibility）
  - 相容性（scalability）
  - 可維護性（maintainability）

## 可靠性

當服務發生狀況時，仍然能正確運行。狀況可能為

- 硬體，通常是無相關性且隨機的
- 軟體，通常是性統性的且難以解決
- 人為

容錯能力（Fault-tolerance）代表他能接受特定狀況的發生，並讓使用者不會受此影響。


## 可延展性

可延展性代表即使流量增加，表現仍是正常的。在討論延展性前，需定義流量（load）和表現能力（performance quantitatively）。以 Twitter 的個人首頁為例，利用回應時間的百分位數（percentiles）代表表現能力。即使流量增加，回應時間的百分位數仍低於特定水平。

在一個可擴充的系統，我們可以增加機器的量（processing capacity）來維持可靠的表現能力。

## 可維護性

可維護性有很多面向，基本上來說，就是為了讓工程師和運維工程師準時。讓系統保持抽象化（把維度提高）可以降低系統的複雜性，並且讓其更容易修改和適應新的功能。

好的操作性（operability）代表能觀察到系統內部運作狀態和健康檢查，並且擁有高效的方式去管理。

## 結論

通常來說不會有一個辦法可以簡單且完整的讓應用程式可靠、好延展和維護。然而，都會有某種模式或工具幫助我們一個一個解決這些問題。

以下這張圖代表一般應用程式的框架：

![](https://i.imgur.com/4uYcSaB.png)
