C#でリレーショナルDBの再発明やってるけどさ

記事サムネイル
1 : 2026/09/15(火) 21:54:58.773 ID:izCOh8T70
AI使えばマジで簡単にできるなこれ
2 : 2026/09/15(火) 21:55:29.520 ID:izCOh8T70
こんな単純なもんだったとは思わなんだ
3 : 2026/09/15(火) 21:55:37.174 ID:tEPwdsdx0
AI使うと高度なプログラムが一瞬でできて面白いよな。
4 : 2026/09/15(火) 21:56:40.146 ID:izCOh8T70
>>3
ちょっと前までは低レベルのプログラムは作れないと思った(情報が無いから)てたけど最近ちゃんと作れるようになってて成長を感じる
5 : 2026/09/15(火) 21:57:49.320 ID:izCOh8T70
C#でメモリをそのまま保存して、再起動した時にメモリをそのままロードしたいんだが出来る?って言ったら普通にポインタ方式のメモリアロケータ作ってくれた
6 : 2026/09/15(火) 21:58:15.087 ID:8rOUIebJ0
AI使ってやると
なにも考えなくなっちゃう
7 : 2026/09/15(火) 21:58:52.769 ID:izCOh8T70
>>6
わかる
作ったの見るだけになる
8 : 2026/09/15(火) 22:00:09.134 ID:izCOh8T70
流石にSQLパーサーとか作ろうとはならんけど外部からC#スクリプトでデータ取得できるところまでは頑張ろうと思う
9 : 2026/09/15(火) 22:02:10.670 ID:kyEiJ2rqd
ググった時のAIは電力くうのかね
いつも表示されるから選択できたらと思ってしまう
16 : 2026/09/15(火) 22:18:20.755 ID:izCOh8T70
>>9
俺はBing派だからその辺わからん
10 : 2026/09/15(火) 22:05:08.654 ID:WDgp5J1E0
外部から情報集めたいなら違法上等でやってもPythonが限界じゃろなぁ😔

RDB再発明がメモリ関連とかC言語知ってるオジからしたら失笑もんなのに😨

そして、昔からIT技術に関わってきてるオジらが現代において遊びでAI触ってるわけないの🥲

11 : 2026/09/15(火) 22:06:21.125 ID:2d8Qjw9R0
>>10
失笑もんって言葉を失笑するわ、オジ認定と違法上等でマウント取ってる時点で中身ゼロだぞ
12 : 2026/09/15(火) 22:10:27.158 ID:00HwEaASa
>>11
レス見る限りIT技術にかかわってない人もしくは疎い人だから暖かくみまってあげないと
13 : 2026/09/15(火) 22:11:23.864 ID:2d8Qjw9R0
>>12
暖かくみまってって何語だよ
疎い認定で上から目線してる時点で中身ゼロ仲間入りだぞ
17 : 2026/09/15(火) 22:20:04.363 ID:izCOh8T70
>>10
RDBのデータを保存するのにメモリを使ったんよ
データ構造をそのまま保存、読み取る時はその保存したメモリのアドレスをそのまま取得してメモリに展開
27 : 2026/09/15(火) 22:25:52.900 ID:WDgp5J1E0
>>17
そうなんだwメモリクリアしたら課金データ全部ぶっ飛んじゃった伝説のヤベーソシャゲ思い出しちゃったw
32 : 2026/09/15(火) 22:27:22.150 ID:izCOh8T70
>>27
メモリクリアする前にファイルとして保存する感じ
でその保存したファイルから直でメモリに展開するイメージ
14 : 2026/09/15(火) 22:12:14.670 ID:BjRO9xt00
で、採用したシステムでハッキング被害とかあったら責任とれんの?
19 : 2026/09/15(火) 22:21:07.334 ID:izCOh8T70
>>14
知らんがな
15 : 2026/09/15(火) 22:13:23.563 ID:zWEmr65K0
何言ってんのかよう分からんけどC#ってC#.NETありきでSQLServerありきなところあるじゃん
18 : 2026/09/15(火) 22:20:45.843 ID:izCOh8T70
>>15
そうそう
だからそのSQLServerを作るところから始めてみたってわけ
21 : 2026/09/15(火) 22:22:43.323 ID:zWEmr65K0
>>18
ん?DBエンジン作ろうとしたの?
そりゃ頑張ったなw
28 : 2026/09/15(火) 22:25:57.026 ID:izCOh8T70
>>21
意外と簡単にできた
正直ビビってる
20 : 2026/09/15(火) 22:21:58.123 ID:izCOh8T70
逆に聞くけどMySQLやPostgreSQLがハッキング対策してると思ってる人?
オープンソースなのに?
22 : 2026/09/15(火) 22:23:02.766 ID:mzPrXSgV0
>>20
そりゃしてるだろ
23 : 2026/09/15(火) 22:23:11.725 ID:BjRO9xt00
>>20
逆になんでしてないと思ってんの?
29 : 2026/09/15(火) 22:26:08.835 ID:izCOh8T70
>>23
してないから
25 : 2026/09/15(火) 22:24:09.972 ID:zWEmr65K0
>>20
クラッキング経験あるけどDBエンジンにそこまで求めるのはかわいそうよ
アプリケーションサーバー側で防げよといいたい
31 : 2026/09/15(火) 22:26:35.795 ID:izCOh8T70
>>25
これ
24 : 2026/09/15(火) 22:23:52.854 ID:mzPrXSgV0
オープンソースだから脆弱性メンテナンスされてないと思ってるのか
むしろオープンソースこそ色んな人にめちゃくちゃチェックされてるだろ
30 : 2026/09/15(火) 22:26:23.408 ID:izCOh8T70
>>24
してると思ってるんだw
26 : 2026/09/15(火) 22:25:34.721 ID:izCOh8T70
最初に聞いたこと答えてくれたやつ
このあとソースコード作ってもらってそれで動いた

結論から言うと、**「現在のメモリ構成をそのままメモリコピーしてpageに振り分ける」だけでは、後で正しく読み戻せない可能性が高い**です。

### なぜそのままコピーだけではダメなのか

メモリ上のデータ構造(特にリレーショナルDBでよく使うもの)には、次のような「位置依存」の要素が普通に含まれます。

1. **ポインタ(アドレス)**
– レコード間のリンク、B+Treeの子ノード、ハッシュテーブルのバケットチェーンなど、ほぼすべてがポインタでつながっています。
– メモリコピーした時点のアドレスは、再ロードしたときに別の場所に配置されるため、無効になります。

2. **相対アドレスやオフセットが混在している場合**
– 一部の実装では「ページ内オフセット」を使っていますが、完全にポインタで書かれている場合は修正が必要です。

3. **アロケータ依存の構造**
– スラブアロケータやオブジェクトプールを使っていると、メタデータやフリーリストもアドレスに依存しています。

4. **エンディアンやアラインメント**
– 同じマシンなら問題になりにくいですが、将来的に別環境で動かす場合は影響します。

つまり「そのままmemcpyしてディスクに書いたものを、別のアドレス空間に読み込んだらそのまま動く」という保証はありません。

### 正しくやるための一般的なアプローチ

| 方法 | 内容 | 速度感 | 実装難易度 |
|——|——|——–|————|
| **ポインタのスウィズル(swizzling)** | 保存時にポインタを「ページID + オフセット」に変換し、読み込み時に実際のアドレスに戻す | 比較的高速 | 中~高 |
| **完全に相対アドレスで設計する** | 最初からポインタを使わず、すべて「ベースアドレス + オフセット」で表現する | 最速に近い | 高(設計段階から必要) |
| **シリアライズ(flatten)する** | メモリ構造を一度線形なバイト列に変換して保存し、読み込み時に再構築する | やや遅い | 中 |
| **mmap + 固定アドレスマッピング** | ページを常に同じ仮想アドレスにマップする(稀) | 非常に高速 | 高(OS依存が強い) |

実務的には**「ポインタスウィズル」か「最初から相対アドレス設計」**のどちらかが主流です。

### おすすめの考え方

– **速度を最優先したい場合**
「ページ内はすべて相対オフセットで持つ」設計にすると、memcpyでほぼそのまま書き出せます。読み込み後もアドレス変換が最小限で済みます。

– **実装を簡単にしたい場合**
まず普通にシリアライズ(レコードを1つずつ書いていく)方式で動くものを作り、後から「メモリイメージをそのまま書く」方式に移行するのが安全です。

– **検証方法**
1. メモリ上でデータを作る
2. ページに書き出す
3. 完全にメモリを解放する
4. 別のアドレス空間に読み込む
5. すべてのポインタを辿ってデータが壊れていないかチェックする

この「完全に解放してから読み戻す」テストをしないと、偶然同じアドレスに載って動いてしまうことがあります。

### まとめ

– そのままメモリコピー → **そのままでは正しく取得できない可能性が高い**(ポインタが壊れる)
– 正しくやるには **ポインタを相対化(スウィズル)する** か **最初から相対アドレスで設計する** 必要がある
– 速度を求めるなら「ページ内相対オフセット」設計が最も有利

もし今のメモリ構造(B+Treeなのか、ハッシュなのか、レコードの持ち方など)がもう少し具体的に分かれば、よりピンポイントなアドバイスができます。どんな構造を想定していますか?

33 : 2026/09/15(火) 22:30:26.483 ID:WDgp5J1E0
ふわふわ綿あめみたいなレスから見るにお花畑の住民なんだろうな🌼😃🌺
34 : 2026/09/15(火) 22:31:33.162 ID:izCOh8T70
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;

// ============================================================
// 定数・共通型
// ============================================================
public static class DbConst
{
public const int PageSize = 4096;
public const int PageHeaderSize = 64;
}

public enum PageType : byte
{
Meta = 0,
Index = 1, // B+Treeノード
Data = 2, // レコード・テーブルヘッダなど
Catalog = 3, // テーブルカタログ用
Free = 255
}

public enum ColumnType : byte
{
Int32 = 1,
String = 2
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PagePtr
{
public int PageId;
public ushort Offset;

public static PagePtr Null => new() { PageId = -1, Offset = 0 };
public bool IsNull => PageId < 0;
public override string ToString() => IsNull ? “Null” : $”({PageId}:{Offset})”;
}

35 : 2026/09/15(火) 22:31:44.577 ID:aLdp4UPY0
メモリ上で読み書きするって普通に昔からあるベタな手法だろ
半沢直樹2期の0話で吉沢亮がクライアントに提案してたシステム高速化手法にもそれ入ってた

コメント

タイトルとURLをコピーしました