4

高さや長さなどをデータベースに保存しようとしています。たとえば、フィートインチなどです。クリーンなデータを保存するこれにアプローチする最善の方法を見つけることはできませんが、管理インターフェイスユーザーが操作するのも簡単です。

5' 7"

後で検索結果関数の一部として並べ替える必要があると予想していますが、そのように保存すると、文字列になります。

私にとって最も論理的に思えるのは、値をインチ(数値)としてデータベースに保存することですが、単一の数値への変換を計算することは、このコンテンツ管理システムを使用する人々にとっては非常に手間がかかります。

また、ユーザーがいくつかの方法のいずれかで入力する可能性があるという懸念もあります。

5' 7"

5'7"

5' 7''

5’ 7”

5‘ 7“

理由を聞かないでください…私たちは皆、人々が愚かなことをすることを知っています。

WordPressの上に高度なカスタムフィールドを使用しているので、この状況で使用する「長さ」または「高さ」のフィールドタイプを作成して、ユーザーに必要な計算を処理できますが、おそらく次のような適切な計画が必要です。アドオンを構築する前に、ソリューションを攻撃します。

このデータを最適にアーカイブする方法を見つけようと頭を悩ませています。どんな解決策もありがたいです。

4

5 に答える 5

7

インチとして保管してください。ユーザーが個別に入力できるようにすることができます(1つはフィート用、もう1つはインチ用)。これにより、検証が可能になり、データ入力の問題がなくなり、適切な並べ替えが簡単になり(74 "は常に64"以上)、簡単に入力できます。除算およびモジュロ演算を使用してフィート/インチに変換されます。(インチとして保存すると、計算もはるかに簡単になります。5'0 "と6'2"の違いよりも、60と74 "の違いを理解する方が簡単です。)

ユーザーが変換を実行できない限り、変換を要求しないでください。あなたはそれをします-データベースに保存される途中でフィート/インチをインチに変換し、それを表示するか編集を許可するためにそれを元に戻します。

私が言ったように、ソートもはるかに簡単です。数値を並べ替えると、常に正しい順序に保たれますが、文字値を並べ替えると問題が発生する可能性があります。たとえば、数値の並べ替えは常に。の109に適切に配置されますが、文字の並べ替えは。の10後に配置され1ます。

于 2012-11-28T17:55:51.470 に答える
5

2つに分けましょう。1つ目は、ユーザーがデータを入力する方法についてであり、2つ目はデータを保存する方法についてです。

1-ユーザー入力
単一のフィールドを提供し、プレビュー時にユーザーが日付を入力できるようにすることができます(フィート/インチを識別するために異なる文字を使用するか、数値のみを受け入れるフィートとインチの異なるフィールドを使用します。

2-データストレージ
1つのフィールドのみを指定する場合は、入力を解析して検証し、数値として保存して簡単に注文できるようにすることをお勧めしますが、毎回数値からフィート/インチに変換する必要があります'これらの値を使用します。私の他の提案は、テーブルで2つのフィールドを使用して、フィードを1つに、もう1つにインチで保存できるようにすることです。これにより、結果セットを注文できるようになり、値を使用する必要があるときに値を変換する際にプロセッサの時間を無駄にすることがなくなります。

于 2012-11-28T18:06:39.567 に答える
1

最も論理的な形式(センチメートル)で保存します。フィートとインチ?!本当に!

ユーザーがフロントエンドでフィートとインチの入力を確認する必要がある場合は、データベースに保存する前にcmに変換してください。

したがって、このような機能を使用してフロントエンドに表示します

/**
 * Converts a height value given in cm to feet and inches
 *
 * @param int $cm
 * @return array
 */
public function convert_to_inches($cm) {
    $inches = round($cm * 0.393701);
    $result = [
        'ft' => intval($inches / 12),
        'in' => $inches % 12,
    ];

    return $result;
}

次に、データベースに保存する前にcmに変換します。

/**
 * Converts a height value given in feet/inches to cm
 *
 * @param int $feet
 * @param int $inches
 * @return int
 */
public function convert_to_cm($feet, $inches) {
    $inches = ($feet * 12) + $inches;
    return (int) round($inches / 0.393701);
}

これの利点は、メートル法とインペリアル法の両方を提供するフロントエンドUIを作成できることです。これは、世界のほとんどがメートル法を使用しているためです。

于 2014-02-11T04:54:22.217 に答える
0

値をデータベースの標準形式に正規化する必要があります。センチメートルまたはミリメートルをお勧めします。これは、インペリアル単位よりも算術に適しているためですが、それはあなた次第です。

(ある程度)任意のユーザー入力をこの標準化された形式に変換する関数を作成する必要があります。たとえば、、、またはセンチメートルに変換5'7''する5'7"関数。関数は妥当な数の妥当な形式を受け入れる必要がありますが、多くの場合、サポートしたいと思い、認識しない他の値を拒否します。5' 7''5' 7"

次に、この正規化された値をデータベースに保存し、必要に応じて出力時にフィート/インチとしてフォーマットします。

于 2012-11-28T17:56:42.733 に答える
0

最も論理的な方法は、値をミリメートル単位でデータベースに格納し、1つのフィールドを幅、別のフィールドを高さとして使用することです。

次に、入力データ(文字列として)をデータベース挿入のためにmms単位の関連する浮動小数点値に変換するCMSのプラグインを構築します...奇妙なことに、最近、小さなJavaScript「プログラム」と同様のことを行いました。 Webサイトのメトリック/インペリアル計算機。

基本的に、JSはユーザー入力文字列を取得し、正規表現で分解して「ユニットブロック」に変換し、次にミリメートルに変換します。

RegExpsは次のようになります。

//regexps
  var reImperialLengths = /[0-9\,\.\/\s]+\s*(?:yd|yds|yard|yards|\'|ft|foot|feet|\"|in|ins|inch|inches)/i;
  var reImperialLengthsFormat = /^[^0-9]*(?:([0-9]+\.?[0-9]*)\s*(?:yd|yds|yard|yards))?\s*(?:([0-9]+\.?[0-9]*)\s*(?:\'|ft|foot|feet))?\s*(?:([0-9]+)\s*(?:([0-9]+)\/([0-9]+))?\s*(?:\"|in|ins|inch|inches))?\s*$/i;

  var reMetricLengths = /[0-9\,\.\s]+\s*(?:m|cm|mm)/i;
  var reMetricLengthsFormat = /^[^0-9]*(?:([0-9]+\.?[0-9]*)\s*(?:m|metres))?\s*(?:([0-9]+\.?[0-9]*)\s*(?:cm|cms|centimetres?))?\s*(?:([0-9]+)\s*(?:mm|mms|millimetres))?\s*$/i;

これにより、ユーザーがデータを入力する方法が大幅に柔軟になり、プログラム自体が数値を処理するため、必要な計算を非常に簡単に実行できます。

数値をフロントエンドでの表示方法に戻すだけです。あなたはそれをそこでもきれいにすることができるので、それ1'はあらゆる304.8mmsもののために出力されます。

ユーザーは入力文字列を詰め込むことができますが、「間違える」方法が少なくなります。

于 2012-11-28T18:06:28.510 に答える