2011-12-10 5 views
0

これは、SQLで複雑なリレーショナルデータベースを設定するよりもJavaでファイル管理システムをセットアップするほうがずっと簡単に思えるからです。JavaクラスはSQLリレーショナルデータベースの良い代替品ですか?

例:Javaで同じ製品のための変数価格は

ことができます製品のファイル:

public class Product implements Serializable { 
    public static int productCount = 0; 
    private final int productID; 
    private final long productRegisterDate; 
    private String productDescription; 
    private List<ProductPrice> productPrices; 
    Product (String desc) { 
     productID = ++productCount; 
     productRegisterDate = Calendar.getInstance().getTimeInMillis(); 
     productDescription = desc; 
     productPrices = new ArrayList<ProductPrice>(); 
    } 
    public Product addPrice(double price, String priceDesc) { 
     productPrices.add(new ProductPrice(price, priceDesc); 
     return this; 
    } 
    public void updateProduct(String desc, ArrayList<ProductPrice> prices) { 
     productDescription = desc; 
     productPrices = prices; 
    } 
    public int getID() return productID; 
    public long getDateRegistered() return productRegisterDate; 
    public String getDescription() return productDescription; 
    public ArrayList<ProductPrice> getPrices() return productPrices; 
} 
public class ProductPrice implements Serializable { 
    private double price; 
    private String priceDescription; 
    ProductPrice(double price, String priceDesc) { 
     this.price = price; 
     priceDescription = priceDesc; 
    } 
} 

は製品を挿入する:

何がSQLリレーショナルデータベースは、次の例の上に私の利益になるだろう
... 
List<Product> myProducts = new ArrayList<Product>(); 
myProducts.add(new Product("product a") 
    .addPrice(1.99,"250g pack") 
    .addPrice(2.99,"500g pack"); 

Productオブジェクトを見つける:

対象と

問い合わせ製品情報:

... 
String productDescription = p.getDescription(); 

オブジェクトなしで更新製品情報:

public boolean updateProductByID(int pid, String desc, ArrayList<ProductPrice> prices) { 
    Product p = null; 
    try { 
     p = findProductById(pid); 
     p.updateProduct(desc, prices); 
    } catch (NullPointerException e) { 
     return false; 
    } 
    return true; 
} 

負荷データ/保存:

... 
private final String SAVE_PATH = "C:/"; 
private final String PRODUCTS_FILE = "Products.dat"; 
public static boolean saveProducts(ArrayList<Product> myProducts) { 
    ObjectOutputStream out = null; 
    try { 
     out = new ObjectOutputStream(new FileOutputStream(SAVE_PATH+PRODUCTS_FILE)); 
     out.writeObject(myProducts); 
     out.close(); 
    } catch (IOException e) { 
     return false; 
    } 
    return true; 
} 
public static boolean loadProducts(ArrayList<Product> myProducts) { 
    ObjectInputStream in = null; 
    try { 
     in = new ObjectInputStream(new FileInputStream(SAVE_PATH+PRODUCTS_FILE)); 
     myProducts = (ArrayList<Product>) in.readObject(); 
     return true; 
    } catch (IOException e1) { 
     return false; 
    } catch (ClassNotFoundException e2) { 
     return false; 
    } 
} 

私に教えてください、私が知りたいですすべての詳細。 クラスオブジェクト(つまり、製品、受注など)を持つJavaアプリケーションが既にあります。ローカルファイルシステムではなくデータを提供して格納する必要があるかどうか疑問に思っています。

+9

したがって、ファイルベースのオプションでは、データベースと並行処理とACIDを処理できますか? RDBMSが行うことができるアドホッククエリを処理できますか? – Oded

+1

これは任意のDB /レポートツールからアクセスできますか? –

+0

'find product by id'メソッドを使うつもりならば、インデックスを持つべきでしょう。 Javaでは、あなたが自分でそれをやろうとしたら、ハッシュマップをお勧めします。 – corsiKa

答えて

4

あなたが本当にしたい場合は、あなたが望むものを再発明することができます。

長所:

  • あなたは多くのことを学びます。
  • あなたはシステムを完全に制御できます。

短所:

  • あなたはシステムを完全に制御できます。
  • 生計を立てる人の経験を失います。
  • 自分で見つけたすべてのバグを修正する必要があります。
  • 自分でテストする必要があります(たとえば、何百万人もの人が既にRDBMSを使用しています)。
  • 問題が見つかったら、それがデータベースシステムかそれを使用しているシステムかわかりません。

質問がありますが、これを作成するのにどれだけ時間を費やしていますか?

0

非常によく言及されているように、並行性、ACIDおよびアドホッククエリは、DBを必要とする理由のいくつかです。並べ替え、一意の制約、関係、レプリケーション、およびDBエンジンが提供する他の多くのツールを追加します。

オブジェクトの操作が好きな人は、SQLLiteのような設定が簡単なDB上で、Hibernateの使用を開始できます。アプリケーションが大きくなると、SQLLiteからMySQL、PostgreSQL、またはOracleに簡単に移行できます。

1

SQLLite + Hibernateを使用すると、コードが大幅に単純化されます。私はあなたの現在のアプローチは、あなたの共通のデータベースの問題の視点を与えると思う:並行性、一貫性、関係を維持するなど..それらのいずれかを使用する予定がない場合は、純粋なJavaであなたのソリューションを実装することができます。しかし、あなたが上記のことから利益を得ることができると思えば、必要に応じてdbを使う方が良いでしょう。しかし、私があなたがいると信じているように教育目的でそれをやっているなら、あなたのアプローチに固執してください。