次のような型を宣言しました。
type
TLikes = record
Name : string[20];
favColours : array of string[20];
faves = array of TLikes;
レコードにデータが入力されたら、それらをバイナリファイルに保存して、構造が次のようになるようにします。
[John], [Green] [White] [Blue]
[Paul], [Blue] [Red] [White] [Green]
[David], [Red] [Blue] [Green]
[Bob], [White] [Blue]
[Peter], [Blue] [Green] [Red]
たとえば、Davidが好きな色を見つけるのは簡単です。青が好きな人を知りたいときに小さな問題が発生します。だから私がやったことは、次のように2番目のファイルを作成することです…
[Blue], [John] [Paul] [David] [Peter] [Bob]
[Red], [David] [Paul] [Peter]
[White], [Bob] [David] [John] [Paul]
[Green], [John] [David] [Paul] [Peter]
しかし、何かが私に言っています、私は実際に2番目のファイル/データ構造を作成する必要はないはずです、それはただ非効率的であるように見えます。
ここにもっと大きな問題があります…。
デビッドが好きなものの任意の組み合わせが好きな人を見つける必要がある場合はどうなりますか?私の結果は…
Blue and red and green = Paul, David, Peter
Blue and red = Paul, David, Peter
Blue and green = John, Paul, David, Peter
Red and Green = Paul, David, Peter
私の質問はです。
ボブとポールの共通点(青と白)または赤と白の共通点(デビッドとポール)を把握できるように、データ/レコードを構造化するためのより良い方法はありますか?
上記の例を単純化しようとしたことを指摘する必要があると思います。実際には、Tlikes.Nameのデータは次のような文字列になります…
‘decabbadc’
‘bacddbcad’
‘eebadeaac’
これらの文字列は200k以上のオーダーのものがあります。また、Tlikes.FavColoursデータはファイル名です(これらのファイルは約2kあります)。ファイル名は、Tlikes.Name文字列を含むファイルを示します。
Tlikes.Name文字列を指定したファイル名のリストまたはファイル名を指定した文字列のリストを取得できるようにしたい。
注意–何かが私を「セット」に引き寄せていますが、私が理解していることからすると、セット内の要素の数に制限があります。私は正しい方向に進んでいますか?
投稿をお読みいただき、ありがとうございます。
ここでは多対多の関係を扱っています。
データベースの場合、3つのテーブルを配置することを意味します。
1. People
2. Colors
3. Link table between 1 and 2
データベースを利用して問題を修正するか、データベースの場合と同じようにDelphiでモデル化することをお勧めします。
Delphi構造の使用
さらに使用shortstring
を停止します。これらは古く、ロングストリングに比べてメリットはありません。
3つのテーブルを使用すると、色ごとの人と人ごとの色のリストをすばやく取得できます。
仕組みは次のとおりです。
TPerson = record
name: string;
other_data....
end;
TPeople = array of TPerson;
TFavColor = record
name: string;
other_data....
end;
TFavColors = array of TFavColor;
TPersonColor = record
PersonIndex: Cardinal; <<-- index into the TPeople array
ColorIndex: Cardinal; <<-- index into the TFavColors array
end;
TPersonColors = array of TPersonColor;
これで、TPersonColors配列をループして、データを抽出できます。
データベースの使用
SQLでは、データにインデックスが付けられるため、さらに高速になります(外部キーには常にインデックスが付けられます(すべきです))。
SQLステートメントは、青と赤が好きなすべての人がどのように見えるかを確認します(ここではMySQL構文を使用)。
SELECT p.name
FROM person p
INNER JOIN personcolor pc ON (pc.person_id = p.id)
INNER JOIN color c1 ON (pc.color_id = c1.id)
INNER JOIN color c2 ON (pc.color_id = c2.id)
WHERE c1.name = 'red' AND c2.name = 'blue'
GROUP BY p.id <<-- eliminate duplicates (not sure it's needed)
Delphiを使用して、データベースをアプリにリンクするのは簡単です。
それが私がお勧めするルートです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加