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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

5回答

908閲覧

ユニークキーのつくり方を教えてください

tarikihongan

総合スコア27

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/10/15 12:07

考え方を教えてください

ある、ユニークなデータがやってきます。

そのデータをもとに、ABC_xxxxxxxx
という変数を作成するとします
(xは任意の文字・数字)

ABC_xxxxxxxxは重複してはいけなくて、ユニークでなければいけないです。

どのような方法でxの部分の値をセットすればよいでしょうか

ユニークなデータは英語か日本語か、どのような形で来るかはわからなくて、max桁数は30バイトです

<例>
りんご → ABC_123zaqws 
windows98 → ABC_we3rfdss
本日の来場者数 → ABC_123qazxs
(変換後の値は重複しない)

<試したこと>
データベースのシーケンス機能も考えましたが、”ABC_”という共通部分が作れないため、却下しました。
データベース上で採番するのはいろいろとめんどくさそうということで、プログラム上で変数を作りたいと考えています。

もし、ご不明点がございましたら言ってください!
よろしくお願いいたします

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

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

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

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

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

m.ts10806

2020/10/15 12:10

>ユニークなデータがやってきます。 どこからでしょうか。
tarikihongan

2020/10/15 12:18

ファイルからデータの値を取り込みます! そのファイルへは、別のシステムを利用して書き込まれます
m.ts10806

2020/10/15 12:24

では結局そのまま取り込むのが一番なのでは。ユニークなのが決まっているならなおさらです。 書いている内容だけだと全体像が見えないので答えづらい部分はあります。。
sazi

2020/10/15 12:33

ユニークなものに何を付加してもユニークですけど、何が問題なのでしょう?
tarikihongan

2020/10/15 12:33

元のユニークなデータは30バイトなので、最長30文字あります しかし、8文字にしたい。。。という背景があります
m.ts10806

2020/10/15 12:35

なら、元のデータ全く使えないですね。 新たにアプリケーション側で払い出すしかないです。 連動性持たせる必要があるなら30桁のカラムに入れておく。
sazi

2020/10/15 14:14

元の30桁を8桁に短縮するという事ですが、保持するデータ件数は8桁でカバーできるんでしょうか?
tanat

2020/10/15 15:47

30桁→8桁の一方通行(8桁→30桁には戻さない、照合しない)で良いんでしょうか
tarikihongan

2020/10/16 00:29

一方通行で大丈夫です! データ件数は8桁でカバーできます
guest

回答5

0

そもそも30桁を8桁にするとなると、圧縮するしかないように思いますが、それでも8桁には届かないと思います。

データベースのシーケンス機能も考えましたが、”ABC_”という共通部分が作れないため

そんな事ないですよ。
postgresは構造体を定義でき、その構造体を1カラムとしても定義できます。
単純に配列でtext[]として、'{ABC,00000001}'というカラムをキーにすることもできます。
default でシーケンスと組み合わせれば良いだけですし。

ただ、敢えてマルチカラムの一意キーにしたくない理由が分かりませんが。

投稿2020/10/15 14:56

編集2020/10/16 01:07
sazi

総合スコア25327

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

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

0

<例>

りんご → ABC_123zaqws 
windows98 → ABC_we3rfdss
本日の来場者数 → ABC_123qazxs
(変換後の値は重複しない)

上記の様にABC_が共通しているという共通性があるのであれば共通している部分は保存する必要はなくそれ以降の文字列をデータベースに保存すれば良いのではないでしょうか?

りんごの場合123zaqwsだけを保存するという意味です。
そうすればUNIQUE制約ができると思いますし。

投稿2020/10/15 12:21

kai0310

総合スコア2076

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

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

tarikihongan

2020/10/15 12:36

データベースには、以前のデータがあり、「新しいバージョンのデータだよ!」という意味もあり頭の部分にABC_をつけています。 元のユニークなキーは30バイトで、変換後は8桁にしたいので、そのまま使うことはできません。。
guest

0

新しいデータを格納するためのテーブルを別途作成し、必要に応じて旧データが入っているテーブルと結合したビューを作成してそちらを参照する、という手は使えないでしょうか。

それが出来れば、ABC_という固定の文字列を付与するのはビュー側で吸収出来るので、格納方法をもう少し考えやすくなるのではと思います。

投稿2020/10/16 02:30

deaf_tadashi

総合スコア200

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

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

0

ベストアンサー

DB構造を見直すのが妥当だとは思いますが、アプリケーション側が作る&一方通行でいいのであれば、以下の様な泥臭い流れにするのが手っ取り早いんじゃないでしょうか。

  1. フィールドにUNIQUE制約を付ける
  2. アプリケーション側で何でも良いので適当な8桁の乱数を生成する
  3. 重複があったらDB側でエラーを吐いてくれるので何度でも乱数を生成しなおしてINSERTし直す

仮にUNIQUE制約が存在しない or 追加できないであれば

  1. テーブルロックをかける
  2. アプリケーション側で何でも良いので適当な8桁の乱数を生成し、その時点で重複したレコードが無いかSELECTで確認
  3. 無ければINSERTしてロック解除、重複があったら2からやり直し

でしょうか。

UUIDv4で16進数の乱数を取得した後、256進数の文字列に変換すれば8桁でもほぼ衝突することが無いとされる文字列が作れると思います。
(256進数の公的な定義は多分存在しないので、自己定義して変換する必要がありますが)

投稿2020/10/16 00:44

編集2020/10/16 01:03
tanat

総合スコア18727

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

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

0

文字がn種類あるとして、1文字以上30文字以内のデータ文字列パターン総数はn^30以上です。
8文字で表せるキーの文字列パターンはn^8通りで、文字列パターンより多いため、鳩ノ巣原理により、キー1つに対し2つ以上のデータ文字列が対応するものが存在することになります。
つまり、原理的に不可能です。

投稿2020/10/15 15:19

swordone

総合スコア20669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問