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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4990閲覧

掲示板の構造について

drer

総合スコア20

MySQL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2016/10/08 13:17

編集2016/10/08 13:18

現在掲示板を作ろうと思っています。
現在は書き込み、だけができる仮のものを作っているのですが、スレッド作成などはテーブルを新しくつくればいいのでしょうか。一般的にどんな構造なのか教えてほしいです。

html

1<!doctype html> 2<head> 3<title>掲示板</title> 4</head> 5<body> 6<h1>つぶやく</h1><hr> 7<form name="Form" method="POST" action="./show.py"> 8name: <input type="text" size="30" name="name"> 9mail: <input type="text" size="30" name="mail"><br> 10message: <input type="text" size="100" name="message"><br> 11<input type="submit" value="submit" name="button"> 12</form> 13</body> 14</html>

python

1#!C:\Python34\python.exe 2# -*- coding: utf-8 -*- 3import pymysql 4import cgi, sys, io 5from datetime import datetime 6 7class MainSys: 8 9 f = cgi.FieldStorage() 10 11 def __init__(self, *rec): 12 self._connection = None 13 self._cursor = None 14 self._name = MainSys.f.getfirst(rec[0], '') 15 self._mail = MainSys.f.getfirst(rec[1], '') 16 self._message = MainSys.f.getfirst(rec[2], '') 17 18 @property 19 def Name(self): 20 return self._name 21 22 @property 23 def Mail(self): 24 return self._mail 25 26 @property 27 def Message(self): 28 return self._message 29 30 31 def set_con(self, *con): 32 self._connection = pymysql.connect(host=con[0], 33 user=con[1], 34 password=con[2], 35 db=con[3], 36 charset=con[4]); 37 self._cursor = self._connection.cursor() 38 39 40 def read_db(self, sql): 41 self._cursor.execute(sql) 42 for r in self._cursor.fetchall(): 43 yield r 44 45 46 def write_db(self, sql, *rec): 47 self._cursor.execute(sql, (rec[0], rec[1], rec[2])) 48 self._connection.commit() 49 50 51 def close_db(self): 52 self._cursor.close() 53 self._connection.close()

python

1#!C:\Python34\python.exe 2# -*- coding: utf-8 -*- 3import cgi, sys, io 4from system.main_sys import MainSys 5 6sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 7print('Content-Type: text/html\n') 8print('<!doctype html>\n<body>') 9 10s = MainSys('name', 'mail', 'message') 11s.set_con('localhost', 'root', 'pass', 'keiziban', 'utf8') 12 13def show(): 14 for wd in iter(s.read_db('select name, mail, message from keiziban.usershow')): 15 for inwd in wd: 16 print('<p>', inwd, '</p>') 17 print('<hr>') 18 19 20if s.Name != '' and s.Mail != '' and s.Message != '': 21 s.write_db('insert into usershow (name, mail, message) values (%s, %s, %s)', s.Name, s.Mail, s.Message) 22 show() 23else: 24 show() 25s.close_db() 26 27print('</body>\n</html>')

とりあえずはこんな感じで書いているのですが、これからどのようにしていけばいいのでしょうか

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

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

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

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

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

guest

回答2

0

1スレッド1テーブルでも出来そうですけど、別のやり方としては、
スレッド一覧とレス全体で2テーブル、という手法もあります。
テーブル数が増えないし、作成と削除の負荷もないのがメリットです。

そこでは、個々のレスに帰属するスレッドのIDを付けて
どのスレッドのどのレスか、一意に特定できるようにします。
「2ちゃんねる」で、URLをレスごとにつけられるみたいな。

それで、書き込みが増えて重くなったらどうするかといえば、
やはり「2ちゃんねる」のように、一定レス数に到達するか、
最終書き込み日時の古い順で、過去ログに落とすとか。

投稿2016/10/08 14:43

LLman

総合スコア5592

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

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

0

ベストアンサー

新しくテーブルを作るのもアリですね。

ただ、個人的にはテーブルの操作(スレッド新規作成時に作成、スレッドを削除した際にはテーブル削除)はものすごく負荷のかかる操作に思えるので(2016年現在のPCとRDBMSではそんなことは無いのかもしれませんが)自分の場合だったら「投稿にidをMySQL側で自動で当てて、投稿に対する返信はidを参照する方法」を取ります。

MySQLでのテーブルのイメージとしては以下のような具合でしょうか。

| id | name | mail | message | res_id |

id: 投稿に自動で割り当てられた重複しないid
name: 名前
mail: メールアドレス
message: 投稿内容
res_id: この投稿が、ある投稿への返信であった場合に、返信先のidを入れる

以下、拙作ですが、自分も「投稿に寿命のある匿名掲示板」を作っているのですが、参考になれば幸いです。
src/setsuna/models 以下のソースコードが投稿のデータ構造の参考になると思います。

manzyun/Setsuna: Micro SNS or BBS, maybe.

投稿2016/10/08 13:46

manzyun

総合スコア2244

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問