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

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

ただいまの
回答率

90.32%

  • MySQL

    6185questions

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

タグ検索機能について。

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 182

lolol

score 2

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/05/04 06:57

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

    キャンセル

回答 3

0

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

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

//core.php L1890付近
    // Update configuration in file
    function update($fileName, $config)
    {
        $configNew = new YellowDataCollection();
        foreach($config as $key=>$value)
        {
            if(!empty($key) && !strempty($value))
            {
                $this->set($key, $value);
                $configNew[$key] = $value;
            }
        }
        $this->modified = time();
        $fileData = $this->yellow->toolbox->readFile($fileName);
        foreach($this->yellow->toolbox->getTextLines($fileData) as $line)
        {
            preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
            if(!empty($matches[1]) && !is_null($configNew[$matches[1]]))
            {
                $fileDataNew .= "$matches[1]: ".$configNew[$matches[1]]."\n";
                unset($configNew[$matches[1]]);
            } else {
                $fileDataNew .= $line;
            }
        }
        foreach($configNew as $key=>$value)
        {
            $fileDataNew .= ucfirst($key).": $value\n";
        }
        return $this->yellow->toolbox->createFile($fileName, $fileDataNew);
    }
//edit.php L1452付近
    // Update users in file
    function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $modified = "", $errors = "", $pending = "", $home = "")
    {
        if(!empty($password)) $hash = $this->createHash($password);
        if($this->isExisting($email))
        {
            $email = strreplaceu(',', '-', $email);
            $hash = strreplaceu(',', '-', empty($hash) ? $this->users[$email]["hash"] : $hash);
            $name = strreplaceu(',', '-', empty($name) ? $this->users[$email]["name"] : $name);
            $language = strreplaceu(',', '-', empty($language) ? $this->users[$email]["language"] : $language);
            $status = strreplaceu(',', '-', empty($status) ? $this->users[$email]["status"] : $status);
            $modified = strreplaceu(',', '-', empty($modified) ? time() : $modified);
            $errors = strreplaceu(',', '-', empty($errors) ? "0" : $errors);
            $pending = strreplaceu(',', '-', empty($pending) ? $this->users[$email]["pending"] : $pending);
            $home = strreplaceu(',', '-', empty($home) ? $this->users[$email]["home"] : $home);
        } else {
            $email = strreplaceu(',', '-', empty($email) ? "none" : $email);
            $hash = strreplaceu(',', '-', empty($hash) ? "none" : $hash);
            $name = strreplaceu(',', '-', empty($name) ? $this->yellow->config->get("sitename") : $name);
            $language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language);
            $status = strreplaceu(',', '-', empty($status) ? $this->yellow->config->get("editUserStatus") : $status);
            $modified = strreplaceu(',', '-', empty($modified) ? time() : $modified);
            $errors = strreplaceu(',', '-', empty($errors) ? "0" : $errors);
            $pending = strreplaceu(',', '-', empty($pending) ? "none" : $pending);
            $home = strreplaceu(',', '-', empty($home) ? $this->yellow->config->get("editUserHome") : $home);
        }
        $this->set($email, $hash, $name, $language, $status, $modified, $errors, $pending, $home);
        $fileData = $this->yellow->toolbox->readFile($fileName);
        foreach($this->yellow->toolbox->getTextLines($fileData) as $line)
        {
            preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
            if(!empty($matches[1]) && $matches[1]==$email)
            {
                $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n";
                $found = true;
            } else {
                $fileDataNew .= $line;
            }
        }
        if(!$found) $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n";
        return $this->yellow->toolbox->createFile($fileName, $fileDataNew);
    }
  • ファイルベースでデータを保存している
  • ファイルの形式は独自形式っぽい。ほかの個所も見ているとキーバリュー的な感じだったり、CSVぽかったり。

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

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

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

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

  • タグをクリックしたら紐づくエントリーの一覧を表示する
  • エントリーを表示するときに紐づくタグの一覧を表示する
    という機能は高速性を保ったまま実装可能です。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

はじめまして。

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

面白い問いですね。

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

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

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

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

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

追記します


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • MySQL

    6185questions

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