問題タブ [normalization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database-design - 余分なテーブルまたは非固有の外部キー?
システムにはいくつかのタイプのオブジェクトがあり、それぞれがデータベース内に独自のテーブルを持っています。ユーザーはそれらのいずれにもコメントできる必要があります。コメント テーブルをどのように設計しますか? いくつかのオプションを考えることができます:
- 各オブジェクト タイプ (ObjectAID、ObjectBID など) の FK 列を含む 1 つのコメント テーブル
- オブジェクト タイプごとに 1 つずつ、複数のコメント テーブル (ObjectAComments、ObjectBComments など)
- タイプ (「ObjectA」) を示す別の列を持つ 1 つの汎用 FK (ParentObjectID)
あなたならどちらを選びますか?私が考えていないより良い方法はありますか?
python - PythonでURLを正規化するにはどうすればよいですか
PythonでURLを正規化する方法を知りたいのですが。
たとえば、次のようなURL文字列がある場合: " http://www.example.com/foo goo / bar.html"
余分なスペース(またはその他の正規化されていない文字)を適切なURLに変換するPythonのライブラリが必要です。
sql - SQL Server の正規化戦術: varchar vs int Identity
ここで最適なソリューションが何であるか疑問に思っています。
正規化されたデータベースがあるとします。システム全体の主キーは varchar です。私が疑問に思っているのは、このvarcharをintに関連付けて正規化するか、そのままにしておくべきですか? varchar のままにしておく方が簡単ですが、より最適な場合があります
たとえば、私は持つことができます
または私が持っている可能性があります
もちろん、他にもいくつかの一対多の関係を追加してください。
皆さんはどう思いますか?どちらが優れているのか、その理由は?
sql - 非正規化されたインデックス付きビューで正規化されたテーブルを使用することは良い考えですか?
現在、読み取りと書き込みの比率が高い新しいアプリを設計しています。私の現在の雇用主では、パフォーマンス上の理由から、テーブルに非正規化されたデータが多数あります。完全に 3NF テーブルを用意し、インデックス付きビューを使用してすべての非正規化を行う方が良い方法ですか? テーブルまたはビューに対してクエリを実行する必要がありますか?
私が興味を持っている例のいくつかは、列の子テーブルの集計です (たとえば、ユーザーの投稿数がどこかに保存されています)。
mysql - 別のテーブルの条件に基づいて、ある MySQL テーブルのエントリを検索する
ハードウェアの表とインシデントの表があります。各ハードウェアには一意のタグがあり、インシデントはタグに関連付けられています。
少なくとも 1 つのインシデントが未解決としてリストされているすべてのハードウェアを選択するにはどうすればよいですか?
1 つのハードウェアに複数の未解決の問題がある場合、複数回表示されるため、単に参加することはできません。
database-design - データベース設計の質問-フィールドまたは新しいテーブル+1対多
イベント管理サイトのデータベースを設計しています。会場の表とイベントの表があります。各イベントは会場内にあり(会場のIDを格納します)、各会場は都市内にあります。都市が会場テーブルのフィールドである場合(スペルミスにより都市が重複する可能性があります)、または都市のテーブル(それぞれIDと名前が付いている)がある場合は、都市ごとにイベントを検索できる必要があります。都市と会場(cityid、venueid)をリンクする1対多のテーブル?
これはかなり基本的な質問ですが、追加の結合と追加の2つのテーブルがそれに値するかどうかはよくわかりません。
前もって感謝します
[編集]@tvanfosson:各会場が単一の都市に関連付けられているため、多対多から1対多に変更されました。
database - テーブル間で共有される共通 ID タイプの正規化
これは問題の単純化されたバージョンです。
大量のデータを送信してクエリを実行する顧客がいます。彼らは、データを照会できるいくつかの「パブリック」ID を持っている必要があります。(ほとんどの場合、データと一緒に送信する ID を介してシステムにクエリを実行したいと考えていますが、常にそうとは限りません)。簡単にするために、それらを「pid」、「crid」、「musicbrainzid」と呼びます。この情報を格納する「エンティティ」テーブルがあります。次のようになります (「権限」はデータの送信者です)。
次に、「エピソード」、「シリーズ」、「ブロードキャスト」などの個別のエンティティがあります (実際にはもっとたくさんありますが、ここでは単純にしています)。これらにはそれぞれ、エンティティ テーブルを指す entity_id があります。
外部の顧客は、どのように pid または crid を介して検索し、適切なエピソードまたはシリーズを取得し、それが何であるかを適切に識別することができますか? pid を指定すると、エンティティ ID を取得できますが、この値を求めてエピソード、シリーズ、ブロードキャスト テーブルを検索する必要があります。さらに、すべての ID が必ずしも他のすべてのテーブルに関連しているわけではありませんが、エンティティ (「エピソード」など) には複数の ID (pid、crid など) がある場合があります。
戦略:
- pid のエンティティ ID を見つけ、他のすべてのテーブルで pid を検索します。
- エンティティに「entity_type」列を配置しますが、それがエピソード テーブルの pid であるのに、誤って episode.type をシリーズとして設定した場合はどうなるでしょうか? データを複製したくないし、データベースのメタデータを列の値に入れたくありません。
オプション番号1は遅く、間違っているようです(さらに、さまざまなテーブルの構造が異なるため、問題が発生します)。
オプション 2 はデータが重複していることを意味し、このデータは同期しなくなる可能性があります。トリガーを使用してこれを強制することはできますが、これは非常にやっかいなことのように思えます。いずれにせよ、mysql トリガーの実装のバグに何度か遭遇しました。現在この戦略を使用していますが、トリガーはありません。
オプション 3 とは何ですか?
補足: すべての権限/タイプの組み合わせが有効であるとは限らないため、「権限」を別の表に分割する必要があることはわかっています。
javascript - JavaScript でのプログラムによるアクセントの削減 (別名、テキストの正規化またはアクセントの解除)
次のように、2 つの文字列を等しいものとして比較する必要があります。
リューベック == リューベック
JavaScript で。
なんで?さて、Lucene を使用して Java サービスに送信されるオートコンプリート フィールドがあります。そこでは地名が自然に (Lübeck として) 保存されますが、正規化されたテキストとしてインデックスも作成されます。
このようにして、「メキシコ」と入力することを知らない人が「メキシコ」と入力すると、「メキシコ」を返す一致を取得できます (「カフェメキシコ、ドバイ、UAE」など、他の多くのヒットの可能性があります)。
サーバー側で強調表示を行うようにサービスを変更する機能がないため、次のようなクライアント JavaScript 側で強調表示しています。
入力で特殊な正規表現文字をエスケープしているので、もう少し凝っています。これは、ヒットの最初の単純な 1 つの単語の一致には問題ありませんが、「london cafe」のような複数の単語の一致を突然サポートしたい場合は、実際には機能しません。
これは、「london ca」(london cafe と入力していた) と言う場合には機能しません。これは、「Jack London Cabin, Dawson City, Canada」を次のようにマークするためです: "Ja<b>ck</b> <b>London</b> <b>ca</b>bin, Dawson <b>Ci</b>ty, <b>Ca<b/>nada"
[特に「ck」と「Ci」に注意してください]
したがって、私は次のようなクレイジーではないものを探しています。
他の文字のアクセント付きバージョンである文字の範囲をその文字にマッピングするために参照できるコンパイル済みのテーブルはありますか。これは、プレーンなユニコードチャートを意味するものではありません。もしそうなら、奇妙な、おそらく遅い正規表現ステートメントの使用を避けることができますか?
報奨金について: 報奨金
を始める前に 2 つの回答がありました。1 つは Ruby で行うように指示するもので、もう 1 つはMizzardXが書いたもので、私が質問に入れた基本的なフォームを完成させたものです。誤解しないでほしいのですが、彼のように完全に解決できたことに本当に感謝していますが、別の方法があればいいのにと思いました。これまでのところ、質問と回答を見るために立ち寄った人は皆、MizzardX が問題なくカバーしているか、別のアプローチを持っていないと判断したようです。私は別のアプローチに興味があります.バウンティが終了する前にそれが利用できない場合は、MizzardXがバウンティを獲得します.彼は賞金を手に入れるでしょう!)
database-design - ストアド プロシージャまたはトリガーなしで作業する
過去 18 か月間、複雑なデータベースとクライアント インターフェイスに取り組んできました。このアプリケーションには定期的に新しい機能が追加されており、現在では、拠点や海外を含むすべてのオフィスで、毎日数十人のユーザーに使用されています。これは、REAL データベースを備えた REAL アプリケーションであることを示すためのものです。
これまで、ストアド プロシージャを記述する必要はありませんでしたが、クライアント バージョンと更新されたデータベース モデルの間のマイナーな問題を解決するための一時的な場合を除きます (古いクライアント バージョンでは、新しく作成されたフィールドが適切に更新されず、全員が最新のデータベース モデルをインストールするまで)。バージョン)。
同様に、まだトリガーは必要ありませんでした。実際、SP とトリガーは、システムのもの、またはレプリケーション目的で追加されたものだけです。
開発者がデータベースの最適化はデータベースの正規化に反対しなければならないと考えるとき、SP とトリガーは主にデータベース設計のデフォルトを補うために使用されたり、データベース設計ルールをバイパスしようとしたりするために使用されるという奇妙な感覚があります。
問題は、これらのツールは (開発と保守の両方で) 時間がかかることです。各開発者は、データベースで維持するのに最も「費用がかかる」アイテムであることを念頭に置いて、非常に慎重に使用する必要があります。
データベースにストアド プロシージャやトリガーがまったくないかほとんどないことは、データベースの正規化レベルやコードのメンテナンス コストを示す良い指標であると考えてよいでしょうか?
編集:
トリガーと SP の両方を使用することについて公正な議論を提供した人もいます。しかし、これらのツールは、ほとんどの場合、不適切または過剰な方法で使用されていると私は考え続けています。テーブル フィールド間で複雑な更新を行うため、または合計やその他の集計データを再計算するために、いくつのトリガーが設定されていますか? 問題を報告するための一時テーブルを作成するために使用される SP の数は? これらは、開発者がこれらのツールを使用する多くの状況の 2 つであり、これは通常、データベースの設計/正規化の欠陥を示していると思います。
SP とトリガーの使用を厳密に管理する必要があることを認めている人もいます。私も必要だと思います。
私は、他のデータベースで働いているこれらすべての SQL ギークが私たちを見下し、友人たちに「ほら、彼らは SP やトリガーさえ使っていない!ハハ!」と言って、支持する議論を見つけようとしていると告白しなければなりません
mysql - 正規化された MySQL データベースへのフラットファイルのロード
フラットファイルから MySQL データベースにデータをロードし、外部キーを介してテーブル間の関係を作成する最速の方法は何ですか?
たとえば...次の形式のフラットファイルがあります。
4 つのテーブルにロードする必要があります。
具体的には、スケールする方法で外部キーをどのように設定しますか? 数値は 1000 人以上の範囲にあり、それぞれが 100 万以上の遺伝子型を持っています。