質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

3回答

692閲覧

タグ検索機能について。

lolol

総合スコア6

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/05/03 16:12

ブログや、wikiなどにあるタグ機能。
クリックすると、そのタグの一覧が表示されたりするアレです。

Toxiなどのデータベースを利用して実装する方法があるのは知ってます。

Datenstrom Yellowは、データベース不要で簡単にタグ付けwikiなどが作れます。

データベース不要で、タグ機能を作れる方法ってどんなものがあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/05/03 21:57

データベース不要の仕組みを模索されるのはどのような経緯・理由からでしょうか?
guest

回答3

0

使ったことないけど、フラットファイルデータベース、テキストデータベースというジャンル?のデータベースがあります。
気になるようならググってみては?

投稿2018/05/04 01:02

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

はじめまして。

データベース不要で、タグ機能を作れる方法ってどんなものがあるのでしょうか?

面白い問いですね。

少し考えてみてください。正解がない気もしますが。
いくつか方法があるような、でも現実的に考えていくと、1つか2つしかないようにも・・・。

もし自分の周りから データベースがなかったとしたら

  • 自分の作っているシステムはどうやってデータを管理すればいいのだろう
  • そもそもデータとは データ形式っていくつ種類があるのだろう
  • 現実社会だと図書館がいい具体的例になる?
  • コンピュータが導入される前、図書館ではどうやって蔵書を管理していたのだろう? ファイルにあたるも

のは何だろう? そのファイルみたいなものをどうやって管理している?

(いきなり世に出ているサービスのソースを解析、ではもったいない)

このあたりで回答を止めておきますね。

追記します


タグ機能を作れる方法を少し広げて、タグ機能を管理する方法ととらえなおせば、方法が
もっと具体化したものが頭に浮かぶと思います。
いくつか思いついたら、それが正しい、正しい管理法なのか、技術としてどういう仕組みを適用できるか
それぞれを検証するだけです。

いくつか浮かんだら周囲の人に聞いてもいいし、ここで質問してもいいと思いますよ。

投稿2018/05/04 00:18

kawakawa2018

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • 興味があったので、今ざっとソースを読んだだけの知見です。

例えば以下の部分のソースを読んでみると、

PHP

1//core.php L1890付近 2 // Update configuration in file 3 function update($fileName, $config) 4 { 5 $configNew = new YellowDataCollection(); 6 foreach($config as $key=>$value) 7 { 8 if(!empty($key) && !strempty($value)) 9 { 10 $this->set($key, $value); 11 $configNew[$key] = $value; 12 } 13 } 14 $this->modified = time(); 15 $fileData = $this->yellow->toolbox->readFile($fileName); 16 foreach($this->yellow->toolbox->getTextLines($fileData) as $line) 17 { 18 preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches); 19 if(!empty($matches[1]) && !is_null($configNew[$matches[1]])) 20 { 21 $fileDataNew .= "$matches[1]: ".$configNew[$matches[1]]."\n"; 22 unset($configNew[$matches[1]]); 23 } else { 24 $fileDataNew .= $line; 25 } 26 } 27 foreach($configNew as $key=>$value) 28 { 29 $fileDataNew .= ucfirst($key).": $value\n"; 30 } 31 return $this->yellow->toolbox->createFile($fileName, $fileDataNew); 32 }

PHP

1//edit.php L1452付近 2 // Update users in file 3 function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $modified = "", $errors = "", $pending = "", $home = "") 4 { 5 if(!empty($password)) $hash = $this->createHash($password); 6 if($this->isExisting($email)) 7 { 8 $email = strreplaceu(',', '-', $email); 9 $hash = strreplaceu(',', '-', empty($hash) ? $this->users[$email]["hash"] : $hash); 10 $name = strreplaceu(',', '-', empty($name) ? $this->users[$email]["name"] : $name); 11 $language = strreplaceu(',', '-', empty($language) ? $this->users[$email]["language"] : $language); 12 $status = strreplaceu(',', '-', empty($status) ? $this->users[$email]["status"] : $status); 13 $modified = strreplaceu(',', '-', empty($modified) ? time() : $modified); 14 $errors = strreplaceu(',', '-', empty($errors) ? "0" : $errors); 15 $pending = strreplaceu(',', '-', empty($pending) ? $this->users[$email]["pending"] : $pending); 16 $home = strreplaceu(',', '-', empty($home) ? $this->users[$email]["home"] : $home); 17 } else { 18 $email = strreplaceu(',', '-', empty($email) ? "none" : $email); 19 $hash = strreplaceu(',', '-', empty($hash) ? "none" : $hash); 20 $name = strreplaceu(',', '-', empty($name) ? $this->yellow->config->get("sitename") : $name); 21 $language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language); 22 $status = strreplaceu(',', '-', empty($status) ? $this->yellow->config->get("editUserStatus") : $status); 23 $modified = strreplaceu(',', '-', empty($modified) ? time() : $modified); 24 $errors = strreplaceu(',', '-', empty($errors) ? "0" : $errors); 25 $pending = strreplaceu(',', '-', empty($pending) ? "none" : $pending); 26 $home = strreplaceu(',', '-', empty($home) ? $this->yellow->config->get("editUserHome") : $home); 27 } 28 $this->set($email, $hash, $name, $language, $status, $modified, $errors, $pending, $home); 29 $fileData = $this->yellow->toolbox->readFile($fileName); 30 foreach($this->yellow->toolbox->getTextLines($fileData) as $line) 31 { 32 preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches); 33 if(!empty($matches[1]) && $matches[1]==$email) 34 { 35 $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n"; 36 $found = true; 37 } else { 38 $fileDataNew .= $line; 39 } 40 } 41 if(!$found) $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n"; 42 return $this->yellow->toolbox->createFile($fileName, $fileDataNew); 43 } 44 45
  • ファイルベースでデータを保存している
  • ファイルの形式は独自形式っぽい。ほかの個所も見ているとキーバリュー的な感じだったり、CSVぽかったり。

という事がわかるので、何らかの方法でタグの構造をシリアライズしてデータを保持し、各機能を実現しています。

具体的なデータ構造はタグを処理している部分を読んでみないとわかりませんが、

例えば、
タグ名:タグに紐づくエントリーの配列をシリアライズしたテキスト

エントリーID:紐づくタグ名の配列をシリアライズしたテキスト
の2種類のデータを管理しておけば、

  • タグをクリックしたら紐づくエントリーの一覧を表示する
  • エントリーを表示するときに紐づくタグの一覧を表示する

という機能は高速性を保ったまま実装可能です。

ファイルを細かく分けたり、良い感じの粒度で情報をシリアライズしたり等、工夫は多くされていると思われるので、実際にタグを処理している部分のソースを追ってみればわかると思うので、是非ソースを追ってみて結果を教えてください。

投稿2018/05/03 23:11

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問