現在Users
、次の列を持つテーブルがあります。
- ユーザーID
- 住所
現在、列に IP アドレスを格納していAddress
ます。先に進むには、たとえば MAC アドレスを保存する必要があります。両方を同じ列に格納し (どちらも) 、アドレスのタイプを示す 1 または 2 でvarchar
どのタイプかを示す別の列を用意することをお勧めします。typeOfAddress int
または、別のnull可能な列を作成する必要があります(既存のものもnull可能に変更します)
現在Users
、次の列を持つテーブルがあります。
現在、列に IP アドレスを格納していAddress
ます。先に進むには、たとえば MAC アドレスを保存する必要があります。両方を同じ列に格納し (どちらも) 、アドレスのタイプを示す 1 または 2 でvarchar
どのタイプかを示す別の列を用意することをお勧めします。typeOfAddress int
または、別のnull可能な列を作成する必要があります(既存のものもnull可能に変更します)
いいえ、それは良い習慣ではありません。数十年前に私が最初に言われたことの 1 つは、「コンピューター分野は複数の目的に使用してはならない」というものでした。そうしないと、他の値タイプに使用する別のインジケーター フィールドがない限り、原則としてそれが何を意味するかを知る方法がなく、まったく不必要な誤解のリスクが生じます。
別の null 許容列を絶対に作成します。これにより、将来のすべての SQL をこのテーブルに簡単に記述できるようになり、全体的にすべてをより保守しやすくなります。
まあ、与えられた情報に基づいて、それは異なります。
ユーザーは IP アドレスと MAC アドレスの両方を持っていますか? その場合、これらのレコードを、ユーザー レコードとの外部キー関係を持つ別のテーブルに配置する必要があります。
回収はどうする?ユーザーに関するデータを取得するときに、これらの値を頻繁に取得する必要がありますか? その場合、それらを同じテーブルに格納し、毎回テーブル結合を避けることが理にかなっている場合があります。
1 つは 用でIpAddress
、もう 1 つは 用MacAddress
です。このようにして、別の列を参照して把握する必要なく、どのデータがどの列にあるかが明確になります。
さらに多くの異なる種類のアドレスを追加する予定がない場合は、2 つの列を使用することをお勧めします。概念的にはシンプルで、クエリも簡単だと思います。しかし、より多くの種類の「住所」を追加しようとしている場合 (それが何であれ)、5 つまたは 6 つの異なる列を持つことは理想的ではないかもしれません。その場合、1 つの address 列と 1 つの address_type 列を使用して、住所タイプを定義するジャンクション テーブルを作成します。
新しい列を作成する代わりに、新しいテーブル Address と AddressType を作成し、それらにリンクします。
Users
foreign key address_id
Address
id
value (varchar)
foreign key adress_type_id
AddressType
id
name (varchar)
やり過ぎかもしれませんが、それは良い正規化の練習です
推奨される構造は次のとおりです。
3rd NFだから。
単一のテーブルで単純に複数の列を使用することの欠点は次のとおりです。
有効に見えても有効ではない AddressType が誤って入力されるのを防ぐために、FK リレーションシップを使用して AddressType テーブルを追加する必要があります。
理論的には、AddressType ごとに個別のテーブルが作成され、UserId でユーザー テーブルにリンクされます。しかし、それは提示された問題に対してはやり過ぎのように見えます。