2017-02-13 51 views
0

我很難真正地指出問題,但我會盡我所能來描述它: 在企業的數據庫驅動的應用程序中,存在始終存在的對象(數據庫中的行)。應用程序在啓動時不能沒有它們,因爲它們是創建應用程序的業務的修復部分。在應用程序開發中處理預裝系統對象的最佳做法是什麼?

例子:

  • 如果應用程序管理聯繫人應用程序正在運行的接觸(因此「客戶」他/她)已經在應用程序中可用的聯繫。
  • 如果是爲某種類型的商業創建發票的應用程序,則必須有幾個實體類型產品的記錄,這些記錄已具有某些屬性。
  • 在手機已經有一些預裝的輪廓

這些對象是衆所周知的程序員和用戶。程序員必須能夠訪問它們(加載特殊的已知客戶聯繫人或加載默認配置文件)。現在我的問題是:

  1. 是否有這些類型的對象/這種設置或模式的共同名稱?我可以想象這與「測試裝置」類似,但我只談論生產環境,而不是測試。
  2. 如何解決這些對象?我在哪裏保存它們?我如何加載它們?
  3. 由於他們總是在場,我如何告訴系統他們是隻讀的,不能刪除?

回答

0

在我回答之前,我會問問題 - 你如何部署數據庫模式?這些數據稱爲特定於Env的模式和內容(至少它們在這裏被調用,我工作的地方),它通常通過某種部署/自動化工具部署到數據庫中(專有/ CD /可靠/ docker /你的名字 - 如果你已經將模式部署到數據庫中,最好是向它添加內容將是同一機制的責任)。

將其視爲數據庫的默認清單,並且我猜它會使您的產品生命週期取得進展 - 因此它可能是使用該數據的主要部署代碼的存儲庫的一部分或至少與其關聯。 (所以架構/內容會隨着它的消費者而演變)。

這裏最大的問題是向後兼容性,因爲需要跟蹤對這些結構所做的所有更改 - 而且這些更改有時會經常發生。這裏的關鍵是逐步添加更改的各個層次,並且在新版本發佈時將這些更改合併到一個基本文件中。

所以我的答案是:

  1. 這就是所謂的默認數據庫內容(Env特異性,或沒有)
  2. 保持在usess它們(如SQL文件或JSONs依賴的代碼庫您數據庫類型),並加載CD工具/ Ansible/Docker /自制腳本/(有這麼多擅長的工具)。
  3. 幾個可能的策略 -

    數據庫/ ORM /連接器結合:加入某種type財產的模型架構,然後調整在連接器/ ORM水平的行爲 - 即對數據庫拋出的任何查詢修改刪除後,添加WHERE type NOT IN ('default')

    programatic - 同樣,但在API層內的程序級別上完成了過濾/拒絕。

+0

我們使用SQL腳本來創建(或遷移)數據庫模式,然後我們使用插入默認數據的Java工具。記錄與非默認數據存儲在相同的表中,但其ID在預留的數字範圍內。這些ID在Java代碼中保持爲常量。我們需要改變這個策略,因爲我們引入了JPA,並且JPA提供者不支持保留的編號。這就是爲什麼我想看看別人是如何做這件事的。 @Slavik:你說「裝載CD工具等」是什麼意思?這將如何從Java應用程序工作? – Wombat

+0

1.我們使用的策略根本不允許刪除某些模型 - 而不是被硬刪除,記錄被軟刪除, - 它們的標誌屬性從'active'變爲'deleted'。對於許多模型和類型的數據,它是方便的,並且更安全的方法(選擇也取決於某些模型/實體的數據量)。2.即使您確實需要硬刪除,對於缺省數據標誌default使用,並且在連接器/ ORM級別有自動修改DB查詢 - 所以當發出DELETE時,然後在WHERE鍵入NOT IN('default')。 – BlackStork

+0

3.使用CD工具加載它意味着有許多Continiuos Delivery工具可以非常方便地執行數據模式/內容部署和遷移。我們使用Ansible /專有腳本組合來進行數據庫部署自動化,並將數據交付給不同項目和代碼使用的不同關係數據庫。 – BlackStork

相關問題