无模式数据库NoSQL讲解

Jun 07, 2016 pm 03:16 PM
nosql データベース 持っている モデル 説明する

很多NoSQL数据库有个共同点,那就是它们都没有模式。若要在关系型数据库中存储数据,首先必须定义“模式”,也就是用一种预定义结构向数据库说明:要有哪些表,表中有哪些列,每一列都存放何种类型的数据。必须先定义好模式,然 后才能存放数据。 相比之下,

很多NoSQL 数据库有个共同点,那就是它们都没有模式。若要在关系型数据库中存储数据,首先必须定义“模式”,也就是用一种预定义结构向数据库说明:要有哪些表格,表中有哪些列,每一列都存放何种类型的数据。必须先定义好模式,然后才能存放数据。
 
相比之下,NoSQL 数据库的数据存储就比较随意了。“键值数据库”可以把任何数据存放在一个“键”的名下。“文档数据库”实际上也如此,因为它对所存储的文档结构没有限制。在列族数据库中,任意列里面都可以随意存放数据。你可以在图数据库中新增边,也可以随意向节点和边中添加属性。
 
无模式数据库的倡导者们很享受它所带来的自由与灵活。如果用了模式,那么就必须提前指明你要存储的数据,然而这一点却比较难办。摆脱模式的制约后,就可以轻易存储所需数据了,于是我们很容易就能根据项目的进展情况来修改原有的数据存储方式,一旦发现了新东西,只要把它们加入数据库中就好。此外,若是发现某些东西已经没用了,那么不再存储它们就行了。在使用模式的关系型数据库中,如果删除了某列,那么你恐怕得担心此操作会不会导致旧数据丢失。
 
除了更改数据方面的差别外,无模式数据库也更容易处理“格式不一致的数据”(nonuniform data),也就是那种每条记录都拥有不同字段集(set of field)的数据。“模式”会将表内每一行的数据类型强行统一,若不同行所存放的数据类型不同,那这么做就很别扭。要么得分别用很多列来存放这些数据,而且把用不到的字段值填成null (这就成了“稀疏表”,sparse table),要么就要使用类似custom column 4 这样没有意义的列类型。而无模式表则没有这么麻烦,每条记录只要包含其需要的数据即可,不用再担心上面的问题了。
无模式数据库很吸引人,而且确实能避免使用“固定模式数据库”(fixed-schemadatabase)时所面临的诸多麻烦,不过,它自身也存在一些问题。若存储数据就是为了将其显示成一列“字段名:字段值”(fieldName :value)格式的简单报表,那“模式”的确是个障碍。
 
可是,通常我们在处理数据时所要完成的任务并不止于此,而且处理数据的程序需要知道存放账单地址的字段叫做billingAddress 而非addressForBilling,quality 字段应该包含整数“5”而非单词“five”。
 

在编写数据访问程序时,必须面对一个关键问题:尽管有时不甚方便,但程序通常要依赖于某种形式的“隐含模式”(implicit schema)。除非只需要执行下面这种极为简单的逻辑。

<span style="font-size:12px;">// pseudo code
foreach (Record r in records) {
  foreach (Field f in r.fields) {
          print (f.name, f.value)
        }
}</span>
ログイン後にコピー

否则,程序必须假定表中存在某些特定的字段名,这些字段中包含带有一定意义的数据,而且还要假定该字段存有某种类型的数据。程序与人类不同,它们不能在看到“qty”后立刻推断出它与“quality”的意义一样,至少在我们没有专门为其编写特定处理代码时,它不行。所以说,不管数据库“无模式”到何种地步,总会存在“隐含模式”。它是指在编写数据操作代码时,对数据结构所做的一系列假设。
应用程序代码中的隐含模式会带来一些问题。它意味着,要想理解数据库中存放的数据,必须深入研究应用程序的代码才行。若代码结构非常好,那么你就可以根据它明确推断出数据的模式了,然而这一点却无法保证,因为它完全取决于应用程序的代码是否清晰。此外,无模式数据库感知不到模式,所以它无法用模式来提升存储与获取数据的效率,它也无法自行验证数据,以防止多个应用程序以不一致的方式操作其数据。
 
上述问题就是关系型数据库采用固定模式的原因,而且过去的数据库基本都使用固定数据模式,也正是基于此种考量。“模式”有其价值,而NoSQL 数据库弃用模式,真是个相当令人吃惊的决定。
 
从本质上说,无模式数据库是把模式交由访问其数据的应用程序代码来处理。如果由多位开发者制作的不同程序要访问相同的数据库,那就麻烦了。有几个办法能缓解此问题。一个办法就是,将所有数据库互动操作封装成独立的应用程序,并通过Web 服务将它与其他应用程序集成。当前很多开发者都通过Web 服务集成应用程序,该方法非常适合此类开发场景。还有一种办法是,在聚合中为不同应用程序明确划分出不同区域。在文档数据库中,可以把文档分成不同的区段(div);在列族数据库中,可以把不同的列族分给不同的应用程序。
 
尽管NoSQL 支持者经常批评关系型数据库,说它必须预定义模式,而且其模式也很不灵活,但事实并非如此。关系型数据库的模式随时可以通过标准SQL 命令修改。
 
在必要时,可以立即添加新列,以存储“类型不一致的数据”。我们只是很少碰到这种情况罢了,但如果真的遇上了,那此方法完全能应付。然而,在大多数情况下,如果你发现待存储的数据类型不统一,那么应该优选无模式数据库。

无模式数据库一直深远地影响着数据库的结构变更,尤其是存储格式不一致的数据时更是如此。关系型数据库的模式也可以用可控的方式改变,只是其运用范围没有理想中那么广罢了。同理,也可以控制无模式数据库存储数据的方式,让访问新、旧数据都比较容易。此外,“无模式”的灵活性仅限于聚合内部,如果改动了聚合边界,那么其数据迁移工作与关系型数据库一样,都非常复杂。


http://www.fix.com.cn/news/yenaxinwen/20140303/3226.html

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

iPhoneでサイレントモードが機能しない:修正 iPhoneでサイレントモードが機能しない:修正 Apr 24, 2024 pm 04:50 PM

おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携​​帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

Hibernate はポリモーフィック マッピングをどのように実装しますか? Hibernate はポリモーフィック マッピングをどのように実装しますか? Apr 17, 2024 pm 12:09 PM

Hibernate ポリモーフィック マッピングは、継承されたクラスをデータベースにマップでき、次のマッピング タイプを提供します。 join-subclass: 親クラスのすべての列を含む、サブクラス用の別個のテーブルを作成します。 table-per-class: サブクラス固有の列のみを含む、サブクラス用の別個のテーブルを作成します。 Union-subclass: join-subclass と似ていますが、親クラス テーブルがすべてのサブクラス列を結合します。

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

HTML がデータベースを読み取る方法の詳細な分析 HTML がデータベースを読み取る方法の詳細な分析 Apr 09, 2024 pm 12:36 PM

HTML はデータベースを直接読み取ることはできませんが、JavaScript と AJAX を通じて実現できます。この手順には、データベース接続の確立、クエリの送信、応答の処理、ページの更新が含まれます。この記事では、JavaScript、AJAX、および PHP を使用して MySQL データベースからデータを読み取る実践的な例を示し、クエリ結果を HTML ページに動的に表示する方法を示します。この例では、XMLHttpRequest を使用してデータベース接続を確立し、クエリを送信して応答を処理することで、ページ要素にデータを埋め込み、データベースを読み取る HTML の機能を実現します。

PHP でデータベース接続エラーを処理する方法 PHP でデータベース接続エラーを処理する方法 Jun 05, 2024 pm 02:16 PM

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

Golangを使用してリモートデータベースに接続するにはどうすればよいですか? Golangを使用してリモートデータベースに接続するにはどうすればよいですか? Jun 01, 2024 pm 08:31 PM

Go 標準ライブラリのデータベース/SQL パッケージを通じて、MySQL、PostgreSQL、SQLite などのリモート データベースに接続できます。データベース接続情報を含む接続文字列を作成します。 sql.Open() 関数を使用してデータベース接続を開きます。 SQL クエリや挿入操作などのデータベース操作を実行します。 defer を使用してデータベース接続を閉じ、リソースを解放します。

Golangでデータベースコールバック関数を使用するにはどうすればよいですか? Golangでデータベースコールバック関数を使用するにはどうすればよいですか? Jun 03, 2024 pm 02:20 PM

Golang でデータベース コールバック関数を使用すると、次のことを実現できます。 指定されたデータベース操作が完了した後にカスタム コードを実行します。追加のコードを記述せずに、個別の関数を通じてカスタム動作を追加します。コールバック関数は、挿入、更新、削除、クエリ操作に使用できます。コールバック関数を使用するには、sql.Exec、sql.QueryRow、または sql.Query 関数を使用する必要があります。

See all articles