ブログや、wikiなどにあるタグ機能。
クリックすると、そのタグの一覧が表示されたりするアレです。
Toxiなどのデータベースを利用して実装する方法があるのは知ってます。
Datenstrom Yellowは、データベース不要で簡単にタグ付けwikiなどが作れます。
データベース不要で、タグ機能を作れる方法ってどんなものがあるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
はじめまして。
データベース不要で、タグ機能を作れる方法ってどんなものがあるのでしょうか?
面白い問いですね。
少し考えてみてください。正解がない気もしますが。
いくつか方法があるような、でも現実的に考えていくと、1つか2つしかないようにも・・・。
もし自分の周りから データベースがなかったとしたら
- 自分の作っているシステムはどうやってデータを管理すればいいのだろう
- そもそもデータとは データ形式っていくつ種類があるのだろう
- 現実社会だと図書館がいい具体的例になる?
- コンピュータが導入される前、図書館ではどうやって蔵書を管理していたのだろう? ファイルにあたるも
のは何だろう? そのファイルみたいなものをどうやって管理している?
(いきなり世に出ているサービスのソースを解析、ではもったいない)
このあたりで回答を止めておきますね。
追記します
タグ機能を作れる方法を少し広げて、タグ機能を管理する方法ととらえなおせば、方法が
もっと具体化したものが頭に浮かぶと思います。
いくつか思いついたら、それが正しい、正しい管理法なのか、技術としてどういう仕組みを適用できるか
それぞれを検証するだけです。
いくつか浮かんだら周囲の人に聞いてもいいし、ここで質問してもいいと思いますよ。
投稿2018/05/04 00:18
総合スコア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
総合スコア18713
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。